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

如何在ggplot2中为不等规模队列创建不规则分面网格

实现按队列分组的不规则分面网格

针对你的重复测量数据可视化需求,以下两种方法可以实现按队列分行、单个受试者分面的不规则网格效果:

方法1:使用ggh4x包的facet_grid2

ggh4x是ggplot2的扩展包,原生支持不规则分面网格,无需手动拼接图表,是最便捷的方案。

实现代码

# 首次使用需安装包
# install.packages("ggh4x")

library(ggplot2)
library(ggh4x)

# 基于你生成的d数据框绘图
ggplot(d, aes(tpt, y)) +
  geom_line() +
  facet_grid2(rows = vars(cohort), cols = vars(subjid), 
              space = "free", scales = "free",
              labeller = labeller(cohort = function(x) paste("队列", x))) +
  theme_bw()

参数说明

  • rows = vars(cohort):指定按队列作为行分组
  • cols = vars(subjid):指定按单个受试者作为列分面
  • space = "free":自动适配每行的列数,避免出现空白分面
  • scales = "free":可选参数,若需要不同分面的轴范围独立调整可保留;若要所有分面轴刻度一致,改为scales = "fixed"即可

方法2:改进patchwork实现轴对齐

如果不想依赖额外包,可以通过统一轴范围的方式,修复你之前用patchwork时的对齐问题:

实现代码

library(ggplot2)
library(patchwork)

# 提前计算全局的x、y轴范围,保证所有子图轴一致
x_range <- range(d$tpt)
y_range <- range(d$y)

# 生成每个队列的子图
plot_list <- lapply(unique(d$cohort), function(c) {
  d_sub <- subset(d, cohort == c)
  ggplot(d_sub, aes(tpt, y)) +
    geom_line() +
    facet_grid(cohort ~ subjid) +
    coord_cartesian(xlim = x_range, ylim = y_range) + # 强制统一轴范围
    theme_bw() +
    theme(axis.title = element_blank()) # 隐藏子图轴标题,避免重复
})

# 拼接子图并设置对齐
wrap_plots(plot_list, ncol = 1, align = "hv") +
  plot_annotation(title = "受试者重复测量数据",
                  xlab = "时间点", ylab = "响应值") # 添加全局轴标题

关键修复点

  • coord_cartesian()强制所有子图使用相同的轴范围,是实现跨行列对齐的核心
  • align = "hv"让子图在水平和垂直方向都严格对齐
  • 用plot_annotation()统一添加全局轴标题,避免每个子图重复显示标题

内容的提问来源于stack exchange,提问作者Mikko Marttila

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:10:33