ggplot多年月度数据绘图报错:aesthetics与unique()异常排查
原代码及问题
原用于绘制多年月度数据的R代码:
TmpData<-read.csv('BeaverDay.csv', header=TRUE) TmpData$Date <- as.Date(with(TmpData, paste(Year, Month, Day, sep="-" )),"%Y-%m-%d") dat<-data.frame(Var=TmpData$CaMgDTE , date=TmpData$Date) ggplot(dat, aes(`year<-`(date, 2011), Var, col = factor(year))) + geom_line() + labs(x = "", col = "year")
这段代码仅能在某一个文件上正常生成图表,其他同格式文件运行时会报两类错误:
aesthetics must be either length 1 or the same as the data(xxx)
Error in `geom_line()`: ! Problem while computing aesthetics. ℹ Error occurred in the 1st layer. Caused by error in `unique.default()`: ! unique() applies only to vectors
其中有一个文件仅提示移除NA但仍可生成图表,说明NA不是报错的核心原因。
数据片段对比
可用数据片段:
data.frame(head(TmpData))
Day Month Year DateCode JulianD CaNa AgTUg Al_Diss_Mg Al_T_Mg AsExMg
1 17 11 1987 32098 322 16.12 NA NA NA NA
2 1 12 1987 32112 336 16.12 NA NA NA NA
3 15 12 1987 32126 350 15.05 NA NA NA NA
4 29 12 1987 32140 364 16.28 NA NA NA NA
5 12 1 1988 32154 12 15.21 NA NA NA NA
6 26 1 1988 32168 26 14.68 NA NA NA NA
不可用数据片段:
data.frame(head(TmpData))
Day Month Year DateCode JulianD AgTUg Al_Diss_Mg Al_T_Mg AsExMg AsTMg
1 5 6 1981 29742 157 NA NA NA NA NA
2 12 10 1981 29871 286 NA NA NA NA NA
3 18 2 1982 30000 49 NA NA NA NA NA
4 21 6 1982 30123 173 NA NA NA NA NA
5 25 6 1982 30127 177 NA NA NA NA NA
6 2 7 1982 30134 184 NA NA NA NA NA
(注:绘制变量未展示,文件含超100列)
已尝试修改绘图年份、移除NA、确认Date列为Date类型,但问题未解决。
报错原因及解决方案
报错核心原因
在ggplot的aes()里使用col = factor(year)时,这里的year并不是数据框dat中的列,而是调用year<-函数时的临时变量,导致ggplot无法正确识别其为与数据行匹配的向量,触发长度不匹配或unique()函数的报错。
修正后的代码
提前在数据框中提取年份信息,同时统一日期的年份用于x轴展示:
TmpData<-read.csv('BeaverDay.csv', header=TRUE) TmpData$Date <- as.Date(with(TmpData, paste(Year, Month, Day, sep="-" )),"%Y-%m-%d") # 新增年份列,用于颜色映射 dat<-data.frame( Var=TmpData$CaMgDTE, date=TmpData$Date, year = format(TmpData$Date, "%Y") # 提取原始年份 ) # 统一x轴的年份为2011,保留月日信息 dat$plot_date <- as.Date(format(dat$date, "2011-%m-%d")) ggplot(dat, aes(x = plot_date, y = Var, col = factor(year))) + geom_line() + labs(x = "", col = "year")
补充说明
如果数据中存在同一月日对应多个年份的重复点,geom_line()可能会出现连线混乱的情况,可以考虑使用geom_path()或者先按年份分组处理,确保每个年份的时间序列连续。
内容的提问来源于stack exchange,提问作者Janice Brahney

