ggplot绘制呼叫中心通话预测图时美学长度错误求助
解决ggplot绘制通话量预测图的美学匹配错误问题
问题概述
使用ggplot绘制15分钟间隔的呼叫中心通话量及预测结果时,出现美学长度不匹配错误:
Error in `check_aesthetics()`: ! Aesthetics must be either length 1 or the same as the data (8): x
错误原因
- 变量缺失:绘图时指定的
x = micelby15并未存在于micelSeason和mi_training数据框中,仅单独定义了向量但未合并到数据内,导致augment(forecast_1, newdata = mi_training)返回的结果没有micelby15列,ggplot无法匹配x轴数据。 - 拼写错误:变量名
michaelFifteen.summary、michaelby15存在拼写错误,正确应为micelFifteen.summary、micelby15。 - 日期格式错误:
scale_x_datetime中使用%h(缩写月份),应改为%H(24小时制小时)以正确显示时间。
解决方案
- 修正变量拼写错误,将转换后的POSIXct时间列添加到
micelSeason数据框中。 - 确保拆分后的训练集
mi_training包含时间列,使得augment结果能继承该列用于绘图。 - 修正日期标签格式。
完整修正代码
library(readr) library(ggplot2) library(forecast) library(fpp2) library(TTR) library(dplyr) library(readxl) library(lubridate) library(rsample) library(tidyverse) library(broom) # 数据处理部分 micelFifteen <- data.frame(micel[['STARTTIME']]) micelFifteen$by15 <- cut(micelFifteen$micel...STARTTIME..., breaks = "15 min") micelFifteen['counts'] <- 1 micelFifteen.summary <- aggregate(counts ~ by15, FUN =sum, data=micelFifteen) # 添加时间趋势、季节趋势,同时转换by15为POSIXct格式并命名为micelby15 micelSeason <- micelFifteen.summary %>% mutate( time_trend = 1:n(), seasonal_trend = hour(by15), micelby15 = as.POSIXct(by15) # 关键:将时间列整合进数据框 ) # 拆分训练集和测试集 micelsplit <- initial_time_split(micelSeason, prop = 2/3) mi_training <- training(micelsplit) mi_testing <- testing(micelsplit) # 训练线性模型 forecast_1 <- lm(counts ~ time_trend , data = mi_training) # 绘图部分 ggplot(data = micelSeason, aes(x = micelby15, y = counts)) + geom_line() + # augment结果继承mi_training的所有列,包括micelby15,无需重复指定x轴 geom_line(data = augment(forecast_1, newdata = mi_training), aes(y = .fitted), color = "red") + labs(x = "Time", y = "Calls") + scale_x_datetime(date_breaks = "15 Min", date_labels = "%H-%M")
关键说明
- 将
micelby15直接合并到micelSeason中,确保训练集和augment结果都包含该列,从根源解决美学匹配问题。 - 绘图时红色预测线可继承全局的
x = micelby15设置,无需在aes中重复指定,简化代码同时避免错误。
内容的提问来源于stack exchange,提问作者cuteCoder
相关产品推荐
相关产品推荐

