在ggplot2中整合预测结果与观测数据绘制分面折线图
解决时间序列观测与预测数据的分面可视化问题
我来帮你一步步搞定这个问题!首先得修正几个小细节,再把数据整理成ggplot2偏好的长格式(tidy data),这样就能轻松实现分面展示观测和预测结果了。
第一步:修正原始数据框
你定义values2的时候多嵌套了一层values = c(...),这会导致数据框创建出错,先把这个问题修正:
library(tidyverse) library(forecast) # 修正后的原始时间序列数据 df <- data.frame( duration = c(2000,2001,2002,2003,2004,2005), values = c(120,130,140,100,150,170), values2 = c(10,30,40,10,15,17) # 去掉多余的values=嵌套 )
第二步:计算预测值并整理格式
你之前的代码里vc和tc都用了df$values的预测,应该分别对values和values2做预测。另外,我们需要给预测数据匹配对应的时间(延续原始的duration序列),保证后续能和观测数据对齐:
# 定义预测步数,比如预测未来3个时间点 h_steps <- 3 # 处理values的预测结果 fc_values <- forecast(df$values, h = h_steps) %>% as.data.frame() %>% mutate( duration = max(df$duration) + 1:h_steps, # 延续时间序列 variable = "values", type = "Forecast", value = mean # 提取点预测值 ) %>% select(duration, variable, type, value) # 处理values2的预测结果 fc_values2 <- forecast(df$values2, h = h_steps) %>% as.data.frame() %>% mutate( duration = max(df$duration) + 1:h_steps, variable = "values2", type = "Forecast", value = mean ) %>% select(duration, variable, type, value) # 合并两个变量的预测数据 forecast_df <- bind_rows(fc_values, fc_values2)
第三步:把观测数据转成长格式
原始数据是宽格式(每个变量占一列),我们需要转成长格式,让它和预测数据的结构完全一致,这样才能顺利合并:
observed_df <- df %>% pivot_longer( cols = c(values, values2), # 指定要转换的变量列 names_to = "variable", # 存储变量名的列名 values_to = "value" # 存储数值的列名 ) %>% mutate(type = "Observed") # 标记为观测数据
第四步:合并观测与预测数据
现在两个数据框的列名、结构完全匹配,直接用bind_rows合并即可:
combined_df <- bind_rows(observed_df, forecast_df)
第五步:用ggplot2绘制分面折线图
终于到了绘图环节!用facet_grid按variable分面,同时用颜色区分观测和预测数据:
ggplot(combined_df, aes(x = duration, y = value, color = type)) + geom_line(linewidth = 1) + geom_point(size = 2) + # 加上点标记让数据更清晰 facet_grid(vars(variable), scales = "free_y") + # 每个分面用独立y轴(适配数值差异) labs( x = "Year", y = "Value", color = "Data Type", title = "Observed vs Forecasted Values" ) + theme_minimal()
这样就能得到两个分面图,每个分面里都同时展示了原始观测数据的折线,以及后续的预测折线啦!
核心思路说明
- 长格式数据:ggplot2对长格式数据的支持最好,统一结构后分面、分组操作都会非常顺畅。
- 时间对齐:预测数据的
duration必须延续原始序列,才能保证x轴的连续性,避免绘图时出现断层。 - 统一列名:观测和预测数据的列名完全一致是合并的前提,这一步一定要注意。
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

