如何在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
相关产品推荐
相关产品推荐

