使用ggplot2与dplyr绘制累积折线图不符预期,求排查问题
问题:累积折线图与预期不符的原因分析及修正方案
首先来看你的原始代码:
dat <- data.frame(year = as.factor(rep(c(2012:2015),each = 6)), id.2wk = rep(c(18,19,20,21,22,23),times = 4), value = c(1.8,15.6,32.9,27.5,19.6,2.6, 1,8,42,35,11,3, 2,7,12,47,26,7, 2,13,24,46,12,4)) ggplot(dat %>% group_by(year) %>% mutate(cv=cumsum(value)), aes(x = id.2wk, y = cv, colour = factor(year))) + geom_line(size = 1)+ geom_point() packageVersion("ggplot2") # 2.2.1
问题所在
对比当前生成的图和预期图,核心差异有两点:
- 累积值的类型不对:你当前计算的是
value的原始累积和,虽然样本数据中每年的value总和刚好是100,但预期图展示的是累积百分比(y轴范围0-100),逻辑上应该基于占比计算,而非原始数值(如果后续数据总和不是100,当前逻辑就会失效)。 - 缺少起始点:预期图中每条曲线都是从
x=18,y=0开始,但你的代码没有包含这个起始行,导致曲线直接从第一个value的累积值开始绘制。
修正方案
我们需要调整数据处理逻辑,补上起始点并计算累积百分比:
library(dplyr) library(ggplot2) # 1. 为每个年份添加起始行(id.2wk=18,value=0) start_rows <- data.frame( year = factor(2012:2015), id.2wk = 18, value = 0 ) dat_complete <- bind_rows(start_rows, dat) %>% arrange(year, id.2wk) # 2. 计算累积百分比 dat_final <- dat_complete %>% group_by(year) %>% mutate(cv = cumsum(value)/sum(value)*100) %>% ungroup() # 3. 绘制修正后的图 ggplot(dat_final, aes(x = id.2wk, y = cv, colour = year)) + geom_line(size = 1) + geom_point() + scale_y_continuous(limits = c(0, 100)) + # 固定y轴范围和预期一致 labs(y = "累积百分比") # 添加y轴标签
修正后效果
修正后的图会和预期完全匹配:每条曲线从x=18,y=0开始,随着id.2wk增加逐步上升到x=23,y=100,y轴显示的是累积百分比,符合预期的可视化需求。
内容的提问来源于stack exchange,提问作者89_Simple
相关产品推荐
相关产品推荐

