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

如何在ggplot2的多产品预测图中添加RMSE与MAE指标

嘿,我来帮你搞定这个给预测图加精度指标的问题!你要给300组地点-产品组合的预测图添上RMSE和MAE,还得每个地点一张图包含所有产品,这个需求完全可以通过ggplot的文本标注功能结合你的现有代码实现,我给你一步步捋清楚:

解决方案:给时间序列预测图添加精度指标

1. 先确保精度数据和预测数据能对应上

你已经算出的data_accuracy里已经有每个产品(或者地点-产品组合)的RMSE和MAE了,我们直接用这个数据框来给每个子图加标注就行,不用额外做太多数据转换。

2. 修改绘图代码,把指标贴到图上

我们可以用geom_text()在每个子图的合适位置(比如右上角)放上RMSE和MAE,再用facet_wrap()按地点分组,实现“每个地点一张图,包含该地点所有产品”的要求。

我给你改好的完整代码如下,还模拟了多地点的场景,更贴合你的实际业务:

library(tidyverse)
library(tsibble)
library(fable)
library(lubridate)

# 模拟多地点的示例数据(新增location列,对应你的业务场景)
data_ts <- data.frame(
  sales_year = c("2015-01-01", "2015-01-01", "2015-01-01", "2016-01-01", "2016-01-01", "2016-01-01", 
                 "2017-01-01", "2017-01-01", "2017-01-01", "2018-01-01", "2018-01-01", "2018-01-01", 
                 "2019-01-01", "2019-01-01", "2019-01-01",
                 "2015-01-01", "2015-01-01", "2015-01-01", "2016-01-01", "2016-01-01", "2016-01-01", 
                 "2017-01-01", "2017-01-01", "2017-01-01", "2018-01-01", "2018-01-01", "2018-01-01", 
                 "2019-01-01", "2019-01-01", "2019-01-01"),
  location = rep(c("loc1", "loc2"), each=15), # 模拟两个地点
  product = rep(c("a", "b", "c"), 10),
  sales = c(6, 11, 13, 6, 2, 6, 11, 12, 10, 4, 12, 2, 17, 6, 8,
            8, 13, 15, 7, 4, 8, 13, 14, 12, 6, 14, 4, 19, 8, 10)
)

# 转换为tsibble,key设为location+product,匹配你的300组地点-产品组合
data_ts <- data_ts %>% 
  mutate(sales_year = year(sales_year)) %>%
  as_tsibble(index = sales_year, key = c(location, product))

# 划分训练集
data_train <- data_ts %>% filter(sales_year < 2018)

# 模型训练与预测(和你原来的代码一致)
data_ses <- data_train %>% model(ETS(sales ~ error("A") + trend("N") + season("N")))
data_ses_fc <- data_ses %>% forecast(h = 1)

# 计算精度指标(你原来的代码)
data_accuracy <- data_ses_fc %>% accuracy(data_ts)

# 核心绘图代码:添加精度指标+按地点分面
data_ses_fc %>% 
  autoplot(data_ts) + 
  geom_line(aes(y = .fitted), col="red", data = augment(data_ses)) +
  # 添加RMSE和MAE文本标注,放在每个子图的右上角
  geom_text(
    data = data_accuracy,
    aes(
      x = max(data_ts$sales_year) - 0.5, # x轴位置:靠近年份最大值的左侧
      y = max(data_ts$sales) * 0.9,      # y轴位置:靠近销售额最大值的下方
      label = str_glue("RMSE: {round(RMSE, 2)}\nMAE: {round(MAE, 2)}")
    ),
    hjust = 1, vjust = 1, size = 3, color = "darkblue" # 调整对齐方式、大小和颜色
  ) +
  # 按地点分面,每个地点生成一张图,子图是该地点的所有产品
  facet_wrap(~location, scales = "free_y") +
  theme_bw()

几个关键细节说明:

  • 自动匹配指标:因为data_accuracy里的location和product和data_ts的key完全对应,geom_text()会自动把对应组合的RMSE/MAE放到对应的子图里,不用手动逐个处理。
  • 位置可调:你可以调整x和y的参数来改变文本的位置,比如把y改成max(data_ts$sales) * 0.8就能让文本更靠下,避免挡住曲线。
  • 批量处理:不管你有多少组地点-产品组合,这个代码都会自动遍历所有组合,生成对应的分面图,完全适配你的300组规模。
  • 自适应坐标轴:scales="free_y"会让每个产品的y轴自动适配销售额范围,不会因为不同产品销售额差异大导致图表看不清。

如果你的实际数据里地点是单独的列,只要确保tsibble的key包含location和product,分面用~location就可以了,其他部分不用改。

内容的提问来源于stack exchange,提问作者user10675575

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:04:08