使用ggplot2的facet_wrap时如何避免子图大小自动调整?
解决方案
你可以根据自己是否需要保留空分面选择以下两种方案,都可以实现两个图的子图尺寸完全统一:
方案1:原生ggplot方案(最简便)
原理是让两个图的分面布局完全一致,缺失的分面留空,子图就会自动保持相同尺寸。
- 先将ID列转为因子,保留所有水平:
simul$ID <- factor(simul$ID, levels = 1:20)
- 绘制fig2时指定和fig1相同的列数,同时设置
drop = FALSE保留所有因子水平对应的分面:
fig2<-ggplot(data=simul[which(simul$ID >15),], aes(x=TIME,y=VAR1))+ geom_point(color="blue",size=0.8)+ # fig1共15个分面、3行,对应列数为5,此处保持ncol一致 facet_wrap(~ ID, nrow=3, ncol=5, drop = FALSE)
如果不需要显示空白分面,可选择第二种方案。
方案2:固定单分面物理尺寸
借助ggh4x包的facet_wrap2直接指定每个子图的固定宽高,不管分面数量多少,子图尺寸都不会变化:
library(ggh4x) # 两个图使用相同的widths、heights参数设置子图尺寸 fig1<-ggplot(data=simul[which(simul$ID <=15),], aes(x=TIME,y=VAR1))+ geom_point(color="blue",size=0.8)+ facet_wrap2(~ ID, nrow=3, widths = unit(4, "cm"), heights = unit(3, "cm")) fig2<-ggplot(data=simul[which(simul$ID >15),], aes(x=TIME,y=VAR1))+ geom_point(color="blue",size=0.8)+ facet_wrap2(~ ID, nrow=3, widths = unit(4, "cm"), heights = unit(3, "cm"))
如果需要将两个图拼接展示,也可以用patchwork包的force_panelsizes参数统一设置所有子图尺寸:
library(patchwork) fig1 + fig2 + force_panelsizes(cols = unit(4, "cm"), rows = unit(3, "cm")) + plot_layout(nrow = 2)
内容的提问来源于stack exchange,提问作者thogs
相关产品推荐
相关产品推荐

