2015-08-13 5 views
3

Я хочу устроить 3 квадратных ggplots, показывая один из них больше, а два других меньше вместе с первым.grid.arrange(): расположите 3 участка аккуратно

Вот моя попытка:

gg1 <- ggplot(mtcars,aes(x=hp,y=mpg))+ 
     geom_point(aes(color=factor(cyl)),alpha=.5)+ 
     stat_smooth(method='lm', se=F, color='red')+ 
     ggtitle('plot 1')+ 
     theme_bw()+ 
     theme(aspect.ratio=1, 
       legend.position = c(1, 1), 
       legend.justification = c(1,1), 
       legend.background = element_rect(colour = NA, fill = NA)) 


gg2 <- ggplot(mtcars)+ 
     geom_density(aes(x=hp, color=factor(cyl)))+ 
     ggtitle('plot 2')+ 
     theme_bw()+ 
     theme(aspect.ratio=1, 
       legend.position = c(1, 1), 
       legend.justification = c(1,1), 
       legend.background = element_rect(colour = NA, fill = NA)) 


gg3 <- ggplot(mtcars)+ 
     geom_density(aes(x=mpg, color=factor(cyl)))+ 
     ggtitle('plot 3')+ 
     theme_bw()+ 
     theme(aspect.ratio=1, 
       legend.position = c(1, 1), 
       legend.justification = c(1,1), 
       legend.background = element_rect(colour = NA, fill = NA)) 

grid.arrange(arrangeGrob(gg1), 
      arrangeGrob(gg2,gg3, ncol=1), 
      ncol=2, widths=c(1,1)) 

В принципе, я хочу, чтобы верхняя граница маленького Plot2 быть на одном уровне с верхней границей большого Plot1, а нижняя граница plot3 быть на одном уровне с нижняя граница участка1. Также ggtitle1 должны быть на одном уровне с ggtitle 2.

Когда я сохранить тройную сюжет (даже сохраняя нужное соотношение сторон)

png(file = 'test.png',width=900,height=600) 
grid.arrange(arrangeGrob(gg1), 
      arrangeGrob(gg2,gg3, ncol=1), 
      ncol=2, widths=c(1,1)) 
dev.off() 

я получаю что-то вроде этого

enter image description here

Любые идеи о том, как управлять аккуратной организацией?

ответ

1

Я всегда помещаю все в переменную с помощью функции arrangeGrob и сохраняю этот объект с помощью ggsave.

a <- arrangeGrob(arrangeGrob(gg1), arrangeGrob(gg2,gg3, ncol=1), ncol=2, widths=c(2,1)) 
# big plot should be twice wider than two small ones 
ggsave('~/Downloads/jnk.pdf',a) 
ggsave('~/Downloads/jnk.png',a) #in case of png file. 

Имейте в виду, что-то изменилось с новым gridExtra пакета и синтаксис изменился, но с версии 0.9.1 это работает хорошо.

+0

это не решит проблему и в любом случае, я хочу, чтобы ширина была чем-то вроде c (2,1) – ikashnitsky

+0

Ha! widths = c (2,1) решить проблему)) Спасибо! – ikashnitsky

+0

Честно говоря, я не полностью изучил проблему, я только что понял, но да, 'widths = c (2,1)' решает ее :-) – drmariod