使用 facet_wrap 时如何避免自动调整绘图大小?

Posted

技术标签:

【中文标题】使用 facet_wrap 时如何避免自动调整绘图大小?【英文标题】:How to avoid automatic adjustment of the size of the plot when using facet_wrap? 【发布时间】:2022-01-12 15:31:00 【问题描述】:

这是一个例子来说明我想要做什么:

 simul<-data.frame(ID=rep(1:20,5),
                   TIME=rep(1:5,each=20),
                   VAR1=runif(100,0,10))
 fig1<-ggplot(data=simul[which(simul$ID <=15),],
           aes(x=TIME,y=VAR1))+
   geom_point(color="blue",size=0.8)+
   facet_wrap(~ ID,nrow=3)
 fig2<-ggplot(data=simul[which(simul$ID >15),],
         aes(x=TIME,y=VAR1))+
   geom_point(color="blue",size=0.8)+
   facet_wrap(~ ID,nrow=3)

我希望最后一个图 fig2 中的各个图的大小与图 1 相同。

【问题讨论】:

绘图填满你的绘图窗口。交互式地,您可以随意调整绘图窗口的大小。如果要将图形保存到文件中,则需要尝试宽度以使它们具有相同的大小。 【参考方案1】:

您可以通过在两者中指定相同的行数和列数来做到这一点,在fig2 中使用as.table = FALSE,但是会留下很多空白:

fig2<-ggplot(data=simul[which(simul$ID >15),],
             aes(x=TIME,y=VAR1))+
             geom_point(color="blue",size=0.8)+
             facet_wrap(~ ID,nrow=3, ncol=5, as.table=FALSE)

产生

这与fig1 中的各个面板尺寸相匹配,但左侧的标签很难看,所有空白区域也是如此。我怀疑您是否可以对空白区域做任何事情(您通过要求绘图小于它们必须的尺寸来要求它!),但是可能需要对标签等进行一些调整来修复 y 轴标签的位置,或者只需使用+ylab(NULL) 删除它即可。

【讨论】:

真的很接近我想做的,谢谢【参考方案2】:

这是另一种可能性,它使用 ggdraw() 给出的结果与我想要的非常接近:

library("ggplot2")
library("cowplot")
nr<-3
nc<-5
a<-15
simul<-data.frame(ID=rep(1:20,5),
                  TIME=rep(1:5,each=20),
                  VAR1=runif(100,0,10))

fig1<-ggplot(data=simul[which(simul$ID <=a),],
             aes(x=TIME,y=VAR1))+
  geom_point(color="blue",size=0.8)+
  facet_wrap(~ ID,nrow=nr,ncol=nc)

fig2<-ggplot(data=simul[which(simul$ID >a),],
             aes(x=TIME,y=VAR1))+
  geom_point(color="blue",size=0.8)+
  facet_wrap(~ ID,nrow=nr,ncol=nc)

NB_ID<-length(unique(simul[which(simul$ID >a),"ID"]))
HEIGHT<-ceiling(NB_ID/nc)/nr+0.05
WIDTH<-ifelse(NB_ID>=nc,1,NB_ID/nc+0.05)
fig2_ok<- ggdraw() +
          draw_plot(fig2, x = 0, y = 1-HEIGHT, width = WIDTH, height = HEIGHT)

【讨论】:

以上是关于使用 facet_wrap 时如何避免自动调整绘图大小?的主要内容,如果未能解决你的问题,请参考以下文章

避免使用 facet_wrap 从 ggplot 进行情节转换中的图例重复

如何控制显示哪些 facet_wrap 标签

如何(重新)排列 facet_wrap/_grid 的面板?

Facet_Wrap标题与ggplotly中的y轴重叠?

如何修改 facet_wrap 条的宽度?

如何使用“自动调整大小”避免 Android 中的小部件重叠。