ggplot绘制数值均值折线图报错:均值计算提示非数值类型
嗨,我来帮你排查一下问题所在~
问题根源分析
你的代码里有两个关键错误导致了警告和无法生成正确的折线图:
- 错误1:传入字符串给
mean()
你写的mean("hornsgatan")是让R对文本字符串"hornsgatan"计算均值,这显然不是数值类型,所以R返回NA,这就是警告里提示“参数不是数值或逻辑型”的原因。正确的做法是直接引用列名,不要加引号。 - 错误2:
aes()内的逻辑错误
就算去掉引号,mean(hornsgatan)放在aes()里也不符合需求——ggplot默认逐行处理数据,这样写会试图给每一行计算整个列的均值,而不是按日期分组计算每日的均值,完全偏离了你想要的“随时间变化的均值”效果。
两种解决方案
方案1:先预处理数据(推荐,逻辑更清晰)
先用dplyr包按日期分组,计算每日的hornsgatan均值,再用处理好的数据绘图:
library(dplyr) library(ggplot2) # 第一步:计算每日均值 daily_hornsgatan <- Stockholm1 %>% group_by(date) %>% summarise(daily_mean = mean(hornsgatan, na.rm = TRUE)) # 第二步:绘制折线图 ggplot(daily_hornsgatan, aes(x = date, y = daily_mean)) + geom_line() + labs(title = "Hornsgatan Mean", x = "Date", y = "PM10")
方案2:用ggplot内置函数直接计算
如果不想单独预处理数据,可以用stat_summary()让ggplot自动按日期分组计算均值并绘制折线:
library(ggplot2) ggplot(Stockholm1, aes(x = date, y = hornsgatan)) + stat_summary(fun = mean, geom = "line", na.rm = TRUE) + labs(title = "Hornsgatan Mean", x = "Date", y = "PM10")
两种方法都能帮你生成想要的随时间变化的均值折线图,第一种预处理数据的方式更灵活,方便后续扩展分析;第二种则适合快速生成图表。
内容的提问来源于stack exchange,提问作者B.Bos
相关产品推荐
相关产品推荐

