dplyr绘制折线图报错is.finite(x),需添加总均值折线
问题与解决方案
需要为折线图添加代表每年所有字母总均值的第四条线,原代码因数据处理和图层映射错误导致添加失败,以下是修正方案:
原代码错误分析
- 总均值计算错误:
df是按字母和年份聚合后的均值数据,无Numbers列,原代码中mean(Numbers)会报错;同时错误删除了Years列,导致缺失x轴数据。 - 图层映射错误:添加总均值线时未指定对应数据框,直接传入整个数据框作为y值,不符合ggplot的映射规则。
修正后的完整代码
library(tidyverse) # 生成模拟数据 Letters <- rep(c("A","B","C"),20) Years <- rep(c(1990:1999),6) Numbers <- runif(60, min = 0, max = 20) # 计算单个字母每年的均值 df <- data.frame(Letters, Years, Numbers) %>% group_by(Letters,Years) %>% summarise(Letter_Mean= mean(Numbers), .groups = 'drop') # 正确计算每年所有字母的总均值 meanallletters <- df %>% group_by(Years) %>% summarise(all_mean = mean(Letter_Mean), .groups = 'drop') # 绘制折线图并添加总均值线 df %>% ggplot(aes(x=Years, y=Letter_Mean, color = Letters)) + geom_line() + geom_point() + # 指定总均值数据框,映射y轴并设置样式 geom_line(data = meanallletters, aes(y = all_mean, color = "所有字母总均值"), linewidth = 1, linetype = "dashed") + # 自定义颜色,区分各类别 scale_color_manual(values = c("A" = "#F8766D", "B" = "#00BA38", "C" = "#619CFF", "所有字母总均值" = "#C77CFF")) + labs(title = "字母年度均值与总均值对比", x = "年份", y = "均值", color = "类别")
关键说明
- 总均值计算基于
df中的Letter_Mean列,保留Years作为x轴匹配的关键字段。 - 添加总均值线时,通过
data参数单独指定总均值数据框,避免与主数据的映射冲突。 - 用固定字符串作为
color映射值,配合scale_color_manual自定义颜色和线条样式(如虚线、加粗),让总均值线更易区分。
内容的提问来源于stack exchange,提问作者withoutcake
相关产品推荐
相关产品推荐

