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

如何使用ggplot2的facet_grid将12组时间序列绘制成4行3列分面图

需求说明

我生成了12组时间序列数据,之前单独用ggplot2绘制了12张时序图,现在想改用facet_grid合并为4行3列的分面图:列标签对应colname <- c("0.8", "0.9", "0.95")(对应AR模型系数),行标签对应rowname <- c("sd = 1", "sd = 3", "sd = 5", "sd = 10")(对应模拟数据的噪声标准差)。目前已经把所有数据整理为宽表格式:df <- data.frame(xx, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12),请问如何调整代码实现上述需求?


实现方案

不需要单独绘制12张子图再拼接,facet_grid依赖长格式的分面变量即可直接生成对应布局,只需先把宽表数据转换为适配ggplot的长表格式,完整代码如下:

# 加载依赖包
library(tidyr)
library(dplyr)
library(ggplot2)

# 定义分面标签
ar_labels <- c("0.8", "0.9", "0.95")
sd_labels <- c("sd = 1", "sd = 3", "sd = 5", "sd = 10")

# 宽表转长表,生成分面分组变量
df_long <- df %>%
  # 把除时间列xx外的所有数值列转为长格式
  pivot_longer(cols = -xx, names_to = "tmp_group", values_to = "RMSE") %>%
  mutate(
    # 匹配列标签(AR系数,每10行重复3个标签,共重复4轮)
    ar_coef = factor(rep(rep(ar_labels, 4), each = 10), levels = ar_labels),
    # 匹配行标签(噪声标准差,每30行切换一个标签)
    sd_val = factor(rep(sd_labels, each = 3*10), levels = sd_labels)
  )

# 绘制分面图
ggplot(df_long, aes(x = xx, y = RMSE)) +
  geom_line(color = "#F2AA4CFF") +
  geom_point(color = "#101820FF") +
  # 4行3列分面,行对应sd分组,列对应AR系数分组
  # 如需每个子图y轴范围独立适配数据,添加参数 scales = "free_y"
  facet_grid(sd_val ~ ar_coef) +
  xlab("lb") +
  ylab("RMSE") +
  theme_bw() +
  scale_y_continuous(expand = c(0, 0)) +
  # 可选:调整分面标签样式,和预期效果对齐
  theme(
    strip.background = element_rect(fill = "#f0f0f0", color = "black"),
    strip.text = element_text(size = 10, face = "bold")
  )

补充说明

  • 如果需要所有子图y轴范围保持一致,直接使用默认facet_grid参数即可;如果希望每个子图y轴适配自身数据范围,在facet_grid中添加scales = "free_y"参数
  • 该写法比单独生成12个ggplot对象再拼接更易维护,后续调整绘图样式只需修改一处代码即可同步所有子图

内容的提问来源于stack exchange,提问作者Daniel James

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:06:02