首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >格罗布的定位

格罗布的定位
EN

Stack Overflow用户
提问于 2016-12-14 09:06:10
回答 2查看 345关注 0票数 1

我希望用arrangeGrob绘制主图中线性模型的数据和效果图(森林图)的子图。

以下是数据:

代码语言:javascript
复制
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)

这些情节:

代码语言:javascript
复制
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))

即:

代码语言:javascript
复制
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)

而且是:

下面是我如何将它们合并成一个单独的情节:

代码语言:javascript
复制
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)

这意味着:

如何调整位置和尺寸,使sub.plot更小(所有层,例如,文本按比例减少),并定位在main.plot的图例下面

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-14 15:28:40

我强烈推荐用于这类任务的包cowplot。在这里,我正在构建三个嵌套集(左边是主图,然后是右上角的两个传说,然后是右下角的子图)。请注意奇妙的get_legend函数,它使提取传奇变得非常容易。

代码语言:javascript
复制
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
  )

给予:

显然,我建议更改一个(或两者)的调色板,但这应该可以满足您的需要。

如果您真的想要使用sub.plot的图例,而不是其他图例,则可以跳过get_legend

如果您想要的不是均匀大小,您还可以使用rel_widthsrel_heights来调整集合的宽度/高度。

另外,cowplot在加载时设置了自己的默认主题。我通常在加载theme_set(theme_minimal())之后运行它,从而恢复到我喜欢的状态。

票数 2
EN

Stack Overflow用户

发布于 2016-12-14 18:57:54

这里有一个grid.arrange解决方案,

代码语言:javascript
复制
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))

带着这些碎片,

代码语言:javascript
复制
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))

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41138586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档