按年计算fail与attend百分比并使用geom_line()绘图的问题
解决年度fail/attend百分比趋势线绘制问题
问题分析
你的代码存在两个核心问题:
- 误用
mutate而非summarise:mutate会保留原始数据的每一行,导致计算出的perc_fail/perc_attend是单条记录在年度对应总和中的占比,而非年度整体的fail/attend比例。 - 未适配ggplot的绘图格式:没有将两个指标整理为适合分组绘图的长格式,也未指定y轴变量和分组美学,导致
geom_line无法正确生成两条趋势线。
解决方案
完整可运行代码
library(tidyverse) df %>% # 按年份聚合,计算年度fail/attend的百分比 group_by(year) %>% summarise( perc_fail = sum(fail)/n() * 100, # 年度fail占比转百分比 perc_attend = sum(attend)/n() * 100 # 年度attend占比转百分比 ) %>% # 宽格式转长格式,适配ggplot分组绘图 pivot_longer( cols = starts_with("perc_"), names_to = "metric", values_to = "percentage", names_prefix = "perc_" # 去除前缀让指标名称更简洁 ) %>% # 绘制趋势线 ggplot(aes(x = year, y = percentage, color = metric, group = metric)) + geom_line(linewidth = 1) + labs( x = "年份", y = "百分比(%)", color = "指标", title = "年度fail/attend比例趋势" ) + theme_minimal()
关键步骤解释
按年聚合计算比例
使用summarise替代mutate,直接计算每年的fail/attend占比:sum(fail)统计年度内fail=1的总次数,n()统计年度总观测数,两者比值即为该年度的fail率。转换为长格式数据
通过pivot_longer将宽格式的perc_fail和perc_attend列合并为metric(指标类型)和percentage(百分比值)两列,让ggplot可以通过color和group参数区分两条趋势线。绘制趋势线
在aes中指定group = metric确保不同指标的点被正确连接成线,color = metric让两条线以不同颜色区分,同时添加标签和主题提升图表可读性。
可选调整
- 若不需要百分比而是原始比例,去掉代码中的
*100即可。 - 若希望年份轴为连续数值,可在聚合前转换类型:
mutate(year = as.integer(as.character(year)))。
内容的提问来源于stack exchange,提问作者a_todd12
相关产品推荐
相关产品推荐

