如何使用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
相关产品推荐
相关产品推荐

