You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

问题所在

对比当前生成的图和预期图,核心差异有两点:

  1. 累积值的类型不对:你当前计算的是value的原始累积和,虽然样本数据中每年的value总和刚好是100,但预期图展示的是累积百分比(y轴范围0-100),逻辑上应该基于占比计算,而非原始数值(如果后续数据总和不是100,当前逻辑就会失效)。
  2. 缺少起始点:预期图中每条曲线都是从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:27:42