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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:32:27