2015-02-23 4 views
1

Я пытаюсь создать многопользовательский сюжет с одной легендой, используя ggplot. Я был в состоянии создать MultiPanel сюжет сначала создать мои шесть отдельных участков, используя такой код:Добавить одну легенду для многоканального ggplot

p1 <- ggplot(data, aes(y = value, x = Time))+  
geom_point(position="dodge")+geom_line(aes(group=group,linetype=group)) 

enter image description here

Я использовал подобный код для пяти дополнительных участков. Я использовал функцию pushViewport в библиотеке «сетки», чтобы создать mutlipanel сюжет:

pushViewport(viewport(layout = grid.layout(2, 3))) 
print(p1,vp = viewport(layout.pos.row = 1, layout.pos.col = 1))  
print(p2,vp = viewport(layout.pos.row = 1, layout.pos.col = 2)) 
print(p3,vp = viewport(layout.pos.row = 1, layout.pos.col = 3)) 
print(p4,vp = viewport(layout.pos.row = 2, layout.pos.col = 1)) 
print(p5,vp = viewport(layout.pos.row = 2, layout.pos.col = 2)) 
print(p6,vp = viewport(layout.pos.row = 2, layout.pos.col = 3)) 

enter image description here

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

+2

Вот объяснение Хедли с помощью 'grid.arrange': https: //github.com/hadley/ggplot2/wiki/Share-a-legend-between-two-ggplot2-graphs – Rentrop

+1

Почему вы не фасете? http://www.cookbook-r.com/Graphs/Facets_(ggplot2)/ – CMichael

+0

вы можете добавить к p1 <- p1 + теме (legend.justification = 'left', legend.position = c (0,0.75)) , в то время как вы добавляете к другим + тема (legend.position = "none"). Это даст вам одну легенду в левом верхнем углу первого сюжета. Однако, возможно, вам придется немного поиграть со значениями позиции. –

ответ

0

Ниже будет показывать одну легенду в левом верхнем углу, используя тему (legend.justification = 'левый', legend.position = с (0,0.75))

library(grid) 

Пример данных

x<-c(1,1,2,2) 
y<-c(107, 110, 110, 118) 
data<-data.frame(x,y) 
data$group<-as.factor(c(1,2,1,2)) 

Ggplot

p1 <- ggplot(data, aes(y = y, x = x)) + geom_point(position="dodge") + geom_line(aes(group=group,linetype=group)) + theme(legend.justification = 'left', legend.position=c(0,0.75)) 
p2 <- ggplot(data, aes(y = y, x = x)) + geom_point(position="dodge") + geom_line(aes(group=group,linetype=group)) + theme(legend.position = "none") 
p3 <- ggplot(data, aes(y = y, x = x)) + geom_point(position="dodge") + geom_line(aes(group=group,linetype=group)) + theme(legend.position = "none") 
p4 <- ggplot(data, aes(y = y, x = x)) + geom_point(position="dodge") + geom_line(aes(group=group,linetype=group)) + theme(legend.position = "none") 
p5 <- ggplot(data, aes(y = y, x = x)) + geom_point(position="dodge") + geom_line(aes(group=group,linetype=group)) + theme(legend.position = "none") 
p6 <- ggplot(data, aes(y = y, x = x)) + geom_point(position="dodge") + geom_line(aes(group=group,linetype=group)) + theme(legend.position = "none") 

pushViewport(viewport(layout = grid.layout(3, 2))) 
print(p1,vp = viewport(layout.pos.row = 1, layout.pos.col = 1))  
print(p2,vp = viewport(layout.pos.row = 1, layout.pos.col = 2)) 
print(p3,vp = viewport(layout.pos.row = 2, layout.pos.col = 1))  
print(p4,vp = viewport(layout.pos.row = 2, layout.pos.col = 2)) 
print(p5,vp = viewport(layout.pos.row = 3, layout.pos.col = 1))  
print(p6,vp = viewport(layout.pos.row = 3, layout.pos.col = 2)) 
Смежные вопросы