2012-05-25 5 views
43

Проблема здесь немного очевидна, я думаю. Я бы хотел, чтобы легенда была помещена (заблокирована) в верхнем левом углу области печати. Использование c (0,1,0.13) и т. Д. Не является вариантом по ряду причин.Размещение условных обозначений, ggplot, относительно области построения

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

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

Приветствия

+0

Что вы подразумеваете под «участком участка»? Область, заполненная серым цветом? – kohske

+0

@kohske Да, OP в принципе хочет определить правильные координаты для 'legend.position', чтобы разместить легенду в углу« области данных »или в серой области.Как я уже говорил в чате, я подозревал, что кто-то вроде вас должен взвесить сетчатое решение. – joran

+0

@joran, тогда это поведение по умолчанию, и все, что вам нужно, это установить правильное обоснование. – kohske

ответ

42

Update: opts устарел. Пожалуйста, используйте вместо theme, как описано in this answer.

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

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

+0

спасибо, это не «тяжелый верхний левый», но быть удаленным от обоих «краев» будет :) – nzcoops

+13

opts устарел. Используйте тему вместо этого. – papirrin

+0

Возникла ошибка: «не удалось найти функцию« opts ». –

56

Обновление: opts устарели. Пожалуйста, используйте вместо theme, как описано in this answer.

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

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

33

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

Ниже приведен код: 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) 

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

4

Для расширения на excellend ответы выше, если вы хотите добавить отступы между легендой и внешней коробки, используйте 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 на момент написания.

Смежные вопросы