2016-12-14 3 views
1

メインプロットの線形モデルのデータと、サブプロットとしてのarrangeGrobを使用したエフェクト(森林プロット)のプロットをプロットします。grobsの配置

set.seed(1) 
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"))) 

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) 

ggplots:

require(ggplot2) 
require(grid) 
require(gridExtra) 
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.key=element_blank(),panel.border=element_blank(),strip.background=element_blank(),axis.title=element_text(size=8),plot.title=element_text(size=9,hjust=0.5)) 

です: enter image description here

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.key=element_blank(),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) 

そして、次のとおりです。ここで

はデータで enter image description here

そして、ここで私は、単一のプロットにそれらを結合しようとする方法は次のとおりです。

if(!is.null(dev.list())) dev.off() 
blank <- grid.rect(gp = gpar(col = "white")) 
sub.plot.grob <- arrangeGrob(blank,sub.plot,ncol=1) 
combined.plot <- arrangeGrob(main.plot,sub.plot,ncol=2,widths=c(1,1)) 
grid.arrange(combined.plot) 

与える: enter image description here

sub.plotが小さくなるように、どのように私は例えば、(すべての層を位置や大きさを調整しますか、テキストは比例して縮小されます)、main.plotの凡例の下に配置されていますか?

+0

だけで簡単なメモです。なぜ伝説が必要なのですか?あなたの変数は、異なるファセットまたはy軸上の位置によってよく表されるように見えます。ところで、あなたは[this](http:// stackoverflow。(https://cran.r-project.org/web/packages/gridExtra/vignettes/arrangeGrob)を参照してください。[https://cran.r-project.org/web/packages/gridExtra/vignettes/arrangeGrob/com/questions/36198451/.html)? –

答えて

2

この種の作業には、cowplotというパッケージを強くお勧めします。ここでは、3つのネストされたセットを作成しています(左のメインプロット、次に右上の2つの伝説、右下のサブプロット)。凡例を信じられないほど簡単に引っ張ってくれる素晴らしいget_legend機能に注目してください。

plot_grid(
    main.plot + theme(legend.position = "none") 
    , plot_grid(
    plot_grid(
     get_legend(main.plot) 
     , get_legend(sub.plot) 
     , nrow = 1 
    ) 
    , sub.plot + theme(legend.position = "none") 
    , nrow = 2 
) 
    , nrow = 1 
) 

が与える:

明らか

enter image description here

を私はカラーパレットの1つ(または両方)を変更することをお勧めしたいが、それはあなたが望むものを与える必要があります。

実際にsub.plotで凡例を使用する場合は、他の凡例ではなくget_legendをスキップできます。

偶数サイズ以外のものを使用する場合は、rel_widthsrel_heightsを使用してセットの幅/高さを調整することもできます。

さらに、cowplotは、ロード時に独自のデフォルトテーマを設定します。私は通常それをロードした直後にtheme_set(theme_minimal())を実行して、好きなものに戻します。

1

ここgrid.arrangeソリューション、これらのこまごまとして

grid.arrange(grobs = replicate(4, ggplot(), simplify = FALSE), 
      layout_matrix = cbind(c(1,1), c(3,2), c(4, 2)), 
      widths = c(2,1,1)) 

enter image description here

get_legend <- function(p) { 
    g <- ggplotGrob(p) 
    id <- grep("guide", g$layout$name) 
    g$grobs[[id]] 
} 

leg1 <- get_legend(main.plot); leg2 <- get_legend(sub.plot) 
gl <- list(main.plot + theme(legend.position = "none"), 
      sub.plot + theme(legend.position = "none"), leg1, leg2) 

grid.arrange(grobs = gl, 
      layout_matrix = cbind(c(1,1), c(3,2), c(4, 2)), 
      widths = c(2,1,1)) 

enter image description here