You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

解决方案

你可以根据自己是否需要保留空分面选择以下两种方案,都可以实现两个图的子图尺寸完全统一:

方案1:原生ggplot方案(最简便)

原理是让两个图的分面布局完全一致,缺失的分面留空,子图就会自动保持相同尺寸。

  1. 先将ID列转为因子,保留所有水平:
simul$ID <- factor(simul$ID, levels = 1:20)
  1. 绘制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 22:06:01