R语言绘制forecast类时间序列列表的分面网格图问题
解决Forecast列表的3×3分面网格绘图问题
我明白你现在的困扰:手里有一堆forecast类型的对象存在列表里,想把它们排成3×3的分面网格,结果之前用map2的时候没法把列表的名称作为图表标题,只能用"Blank"占位。别着急,下面给你两个实用的解决方案:
方案一:用ggplot2+patchwork(推荐,更灵活美观)
这种方法用autoplot把forecast对象转成ggplot图表,再用patchwork轻松组合成分面,还能完美添加每个列表项的名称作为标题。
首先加载需要的包:
library(forecast) library(purrr) library(ggplot2) library(patchwork)
接下来生成所有带标题的图表列表:
plot_list <- imap(forecasts, function(fc, series_name) { autoplot(fc) + ggtitle(series_name) + # 这里直接用列表项的名称当标题 labs(y = "Monthly Revenue", x = "Time") + theme_bw() + theme(bty = "n") # 去掉边框,和你之前的设置一致 })
然后取前9个图表拼成3×3的网格:
# 生成3行3列的分面图 wrap_plots(plot_list[1:9], ncol = 3, nrow = 3)
如果你的列表里有超过9个forecast对象,还可以把它们按每9个一组拆分,批量生成网格:
# 按每9个一组拆分图表列表 plot_groups <- split(plot_list, ceiling(seq_along(plot_list)/9)) # 循环输出每组的3×3网格 walk(plot_groups, function(group) { print(wrap_plots(group, ncol=3, nrow=3)) })
方案二:用基础绘图+gridExtra(适合习惯基础绘图的场景)
如果你更习惯用基础绘图系统,也可以把每个plot存成绘图对象,再用gridExtra排列:
先加载包:
library(forecast) library(purrr) library(gridExtra)
生成基础绘图的对象列表:
plot_grobs <- imap(forecasts, function(fc, series_name) { # 先记录绘图状态 p <- recordPlot() # 绘制图表,直接用series_name当标题 plot(fc, main = series_name, bty = "n", ylab = "Monthly Revenue", xlab = "Time") p })
然后排列前9个:
grid.arrange(grobs = plot_grobs[1:9], ncol=3, nrow=3)
哦对了,你之前用map2的时候标题没法显示,其实是因为你写死了main="Blank",改成main=time_series应该也能显示名称,但上面的方法更适合批量生成分面网格~
内容的提问来源于stack exchange,提问作者Davide Lorino
相关产品推荐
相关产品推荐

