2016-12-31 30 views
1

У меня есть два ggplot сек Я пытаюсь поставить вместе, используя cowplot «s plot_grid:rel_heights в plot_grid не отвечает

Первый data.frame и ggplot:

require(ggplot2) 
main.df <- data.frame(sample=c(paste("E.plus.A.plus",1:3,sep="_"),paste("E.minus.A.plus",1:3,sep="_"),paste("E.plus.A.minus",1:3,sep="_"),paste("E.minus.A.minus",1:3,sep="_")), 
         replicate=rep(1:3,4),cpm=c(rnorm(12)), 
         factor.level=factor(c(rep("E.plus.A.plus",3),rep("E.minus.A.plus",3),rep("E.plus.A.minus",3),rep("E.minus.A.minus",3)), 
              levels=c("E.plus.A.plus","E.minus.A.plus","E.plus.A.minus","E.minus.A.minus"))) 

main.plot <- ggplot(main.df,aes(x=replicate,y=cpm,color=factor.level))+geom_point(size=3)+ 
    facet_wrap(~factor.level,ncol=length(levels(main.df$factor.level)))+ 
    labs(x="replicate",y="cpm")+scale_x_continuous(breaks=unique(main.df$replicate))+theme_bw()+ 
theme(legend.position="none",panel.border=element_blank(),strip.background=element_blank(),axis.title=element_text(size=8),plot.title=element_text(size=9,hjust=0.5)) 

Второй data.frame и ggplot:

effects.df <- data.frame(factor.level=c("E.plus.A.plus-E.minus.A.plus","E.plus.A.plus-E.plus.A.minus","E.plus.A.plus-E.minus.A.minus", 
             "E.minus.A.plus-E.plus.A.minus","E.minus.A.plus-E.minus.A.minus","E.plus.A.minus-E.minus.A.minus"), 
         effect=rnorm(6),effect.df=runif(6,0,0.5),p.value=runif(6,0,1),y=1:6+0.2) 
effects.df$effect.high <- effects.df$effect+effects.df$effect.df 
effects.df$effect.low <- effects.df$effect-effects.df$effect.df 
effects.df$factor.level <- factor(effects.df$factor.level,levels=effects.df$factor.level) 

sub.plot <- ggplot(effects.df,aes(x=effect,y=factor.level,color=factor.level))+geom_point(size=2.5,shape=19)+geom_errorbarh(aes(xmax=effect.high,xmin=effect.low),height=0.1)+ 
    geom_vline(xintercept=0,linetype="longdash",colour="black",size=0.25)+theme_bw()+theme(legend.position="none",panel.border=element_blank(),strip.background=element_blank(),axis.title=element_text(size=7),axis.text=element_text(size=7),legend.text=element_text(size=7),legend.title=element_text(size=7))+ 
    geom_text(aes(x=effects.df$effect,y=effects.df$y,label=format(signif(effects.df$p.value,2),scientific=T)),size=2.5) 

Моя команда plot_grid:

require(cowplot) 
plot_grid(main.plot,sub.plot,ncol=2,nrow=1,rel_widths=c(2,1.75),rel_heights=c(1,0.5)) 

как я хочу sub.plot быть половина высоты main.plot и нижней выровнены. Это то, что я получаю, хотя:

enter image description here

Игра вокруг с rel_heights не кажется, ничего менять.

ответ

2

rel_heights выделяет вертикальное пространство, когда у вас есть два или более сюжета, уложенных один поверх другого. Поскольку у вас есть только один ряд сюжетов, rel_heights ничего не делает. Например, запустите plot_grid(main.plot, sub.plot, rel_heights=c(2,1), ncol=1), чтобы увидеть, как работает rel_heights.

Чтобы получить желаемый макет, вы можете складывать пустой гранж (графический объект) поверх правого участка, что приведет к тому, что правый участок займет половину доступного вертикального пространства. В приведенном ниже коде мы используем arrangeGrob из пакета gridExtra для складывания nullGrob() поверх sub.plot. Затем помещаем вывод arrangeGrob рядом с main.plot. По умолчанию два гнета arrangeGrob будут занимать половину вертикального пространства. Однако, если вы решили, например, что вы хотите, чтобы sub.plot занимал 2/3 вертикального пространства, вы сделали бы arrangeGrob(nullGrob(), sub.plot, ncol=1, heights=c(1,2)).

require(cowplot) 
require(gridExtra) 
require(grid) 

plot_grid(main.plot, arrangeGrob(nullGrob(), sub.plot, ncol=1), 
      ncol=2, rel_widths=c(2,1.75)) 

enter image description here

+1

, как используется gridExtra возможно grid.arrange предлагает альт подход 'grid.arrange (main.plot, sub.plot, layout_matrix = матрица (с (1,1, Н. А., 2), 2)) ' – user20650

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

  • Нет связанных вопросов^_^