如何在ggplot2中连接历史数据与模型预测折线?
解决ggplot2中预测折线与历史数据末尾衔接的问题
场景说明
使用R语言,拥有Historical_Data(历史数据)和Model_Predictions(三类预测数据:A、B、C)两个数据集,需求是用ggplot2绘制:
- 历史数据的折线图
- 三类预测的
mean_value折线从历史数据最后一个点开始延伸 - 用
low_value和high_value绘制预测的置信区间带
模拟数据集
先模拟符合结构的数据集:
library(tidyverse) # 模拟历史数据:6个月的时间序列 set.seed(123) Historical_Data <- tibble( date = seq.Date(as.Date("2023-01-01"), as.Date("2023-06-30"), by = "month"), value = rnorm(6, 50, 5) ) # 模拟初始预测数据:无衔接历史的点 Model_Predictions <- tibble( category = rep(c("A", "B", "C"), each = 3), date = rep(seq.Date(as.Date("2023-07-01"), as.Date("2023-09-30"), by = "month"), 3), mean_value = c(rnorm(3, 52, 4), rnorm(3, 55, 3), rnorm(3, 48, 5)), low_value = mean_value - 3, high_value = mean_value + 3 )
初始问题:预测折线与历史数据断开
直接用初始数据绘图时,预测折线的起点是第一个预测日期,和历史数据最后一点没有连接:
# 初始绘图代码:折线无衔接 ggplot() + geom_line(data = Historical_Data, aes(x = date, y = value), color = "black", size = 1) + geom_line(data = Model_Predictions, aes(x = date, y = mean_value, color = category)) + geom_ribbon(data = Model_Predictions, aes(x = date, ymin = low_value, ymax = high_value, fill = category), alpha = 0.2) + theme_minimal()
解决方法:为预测数据集添加衔接点
核心思路是把历史数据的最后一个点,复制到每个预测类别下,作为预测折线的起始点:
# 提取历史数据最后一个点,并转换为预测数据的格式 last_hist_point <- Historical_Data %>% slice(n()) %>% mutate( category = NA, mean_value = value, low_value = value, high_value = value ) # 为每个预测类别添加衔接点,合并后按类别和日期排序 joined_predictions <- Model_Predictions %>% bind_rows( last_hist_point %>% mutate(category = "A"), last_hist_point %>% mutate(category = "B"), last_hist_point %>% mutate(category = "C") ) %>% arrange(category, date)
验证有效性:重新绘图
用修改后的数据集绘图,预测折线会从历史数据最后一点自然延伸,置信区间也同步衔接:
# 最终绘图代码:折线成功衔接 ggplot() + geom_line(data = Historical_Data, aes(x = date, y = value), color = "black", size = 1) + geom_line(data = joined_predictions, aes(x = date, y = mean_value, color = category)) + geom_ribbon(data = joined_predictions, aes(x = date, ymin = low_value, ymax = high_value, fill = category), alpha = 0.2) + theme_minimal()
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

