Вопрос по ggplot2, r – Расположение легенды, ggplot, относительно области построения

53

Проблема здесь немного очевидна, я думаю. Мне нравится легенда, помещенная (заблокированная) в верхнем левом углу «области черчения». Использование c (0.1,0.13) и т. Д. Не вариант по ряду причин.

Есть ли способ изменить контрольную точку для координат, чтобы они относились к области построения?

mtcars$cyl <- factor(mtcars$cyl, labels=c("four","six","eight"))
ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + 
opts(legend.position = c(0, 1), title="Legend placement makes me sad")

enter image description here

ура

@kohske Да, ОП в основном хочет иметь возможность определять правильные координаты дляlegend.position разместить легенду в углу «области данных» или серой области. Как я уже упоминал в чате, я подозревал, что кто-то вроде вас должен взвесить решение с использованием сетки. joran
@joran Возможно, это было поведение по умолчанию до 0,9 или 0,89, хотя я не уверен. kohske
@kohske Что бы я знал, я всегда думал, что это зависит от региона устройства. Узнавайте что-то новое каждый день... joran
@joran, это поведение по умолчанию, и все, что вам нужно, это установить правильное выравнивание. kohske
Что вы подразумеваете под "областью заговора"? Регион, который заполнен серым? kohske

Ваш Ответ

4   ответа
46

Update: opts has been deprecated. Please use theme instead, as described в этом ответе.

Размещение направляющей по умолчанию основывается на области графика (то есть области, заполненной серым цветом), но выравнивание по центру. Так что вам нужно установить выравнивание по левому верху:

ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + 
  opts(legend.position = c(0, 1), 
       legend.justification = c(0, 1), 
       legend.background = theme_rect(colour = NA, fill = "white"),
       title="Legend placement makes me happy")

enter image description here

Если вы хотите разместить руководство по всей области устройства, вы можете настроить вывод gtable:

p <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + 
  opts(legend.position = c(0, 1), 
       legend.justification = c(0, 1), 
       legend.background = theme_rect(colour = "black"),
       title="Legend placement makes me happy")

gt <- ggplot_gtable(ggplot_build(p))
nr <- max(gt$layout$b)
nc <- max(gt$layout$r)
gb <- which(gt$layout$name == "guide-box")
gt$layout[gb, 1:4] <- c(1, 1, nr, nc)
grid.newpage()
grid.draw(gt)

enter image description here

Error: User Rate Limit Exceeded nzcoops
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
46

Я искал похожий ответ. Но обнаружил, чтоopts функция больше не является частью пакета ggplot2. После поиска еще немного времени, я обнаружил, что можно использоватьtheme сделать то же самое, что и opts. Поэтому редактируем эту ветку, чтобы минимизировать чужое время.

Ниже приведен аналогичный код, написанныйnzcoops.

mtcars$cyl <- factor(mtcars$cyl, labels=c("four","six","eight"))
library(gridExtra)

a <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + labs(title = "Legend is top left") + 
theme(legend.justification = c(0, 1), legend.position = c(0, 1))

b <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + labs(title = "Legend is bottom right") +
theme(legend.justification = c(1, 0), legend.position = c(1, 0))

c <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + labs(title = "Legend is bottom left") +
theme(legend.justification = c(0, 0), legend.position = c(0, 0))

d <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + labs(title = "Legend is top right") +
theme(legend.justification = c(1, 1), legend.position = c(1, 1))

grid.arrange(a,b,c,d)

Этот код даст точно такой же сюжет.

11

Чтобы расширить ответы на вопросы выше, если вы хотите добавить отступы между легендой и рамкой, используйтеlegend.box.margin:

# Positions legend at the bottom right, with 50 padding
# between the legend and the outside of the graph.
theme(legend.justification = c(1, 0), 
    legend.position = c(1, 0),
    legend.box.margin=margin(c(50,50,50,50)))

Это работает на последней версииggplot2 который v2.2.1 на момент написания.

Error: User Rate Limit Exceededrep(50, times=4)Error: User Rate Limit Exceeded
64

Update: opts has been deprecated. Please use theme instead, as described в этом ответе.

Просто чтобы расширить ответ Кохске, чтобы он был более понятным для следующего человека, чтобы наткнуться на него.

mtcars$cyl <- factor(mtcars$cyl, labels=c("four","six","eight"))
library(gridExtra)

a <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + 
opts(legend.justification = c(0, 1), legend.position = c(0, 1), title="Legend is top left")
b <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + 
opts(legend.justification = c(1, 0), legend.position = c(1, 0), title="Legend is bottom right")
c <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + 
opts(legend.justification = c(0, 0), legend.position = c(0, 0), title="Legend is bottom left")
d <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + 
opts(legend.justification = c(1, 1), legend.position = c(1, 1), title="Legend is top right")

grid.arrange(a,b,c,d)

enter image description here

Похожие вопросы