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

ggplot2中按CRITERION分组计算累积和的分组柱状图错误修正

问题分析与修正方案

咱们来逐一拆解原代码里的关键错误,再给出对应的修正方案:

错误点1:全局累积和而非分组累积和

你怀疑的方向完全正确!cumsum(testData[,"FREQ_RECORDS"])是对整个数据集的FREQ_RECORDS列计算累积,没有按照CRITERION分组。原数据的行顺序是positive、negative、positive、negative...,所以算出来的累积和是57→177→479→543→583→603,完全不是你要的组内累积(positive组应为57→359→399,negative组应为120→184→204)。而且在ggplot的aes()里直接调用cumsum,ggplot会按全局行顺序计算,不会自动识别分组逻辑。

错误点2:不符合ggplot的语法规范

在aes()里直接用testData[,"FREQ_RECORDS"]是冗余且不规范的——ggplot会自动绑定传入的数据框,直接写列名FREQ_RECORDS即可,不需要额外引用原数据框。

错误点3:参数位置错误

width=1被放在了ggplot()函数的参数列表里,但这个参数是geom_bar()专属的,应该移到geom_bar()内部。


修正方案

正确的思路是先预处理数据,按CRITERION分组计算组内累积和,再用处理后的数据绘图。这里提供两种实现方式:

方式1:用dplyr预处理(推荐,代码更清晰)

# 加载所需包
library(ggplot2)
library(dplyr)

# 按CRITERION分组,计算组内累积和
testData_processed <- testData %>%
  group_by(CRITERION) %>%
  mutate(CUM_FREQ = cumsum(FREQ_RECORDS)) %>%
  ungroup()

# 绘制分组柱状图
ggplot(data = testData_processed, aes(x = DATE, y = CUM_FREQ, fill = CRITERION)) +
  geom_bar(stat = "identity", position = "dodge", alpha = 0.5, width = 1) +
  theme_minimal()

方式2:用Base R预处理(无需额外包)

如果你不想加载dplyr,也可以用base R实现分组累积:

library(ggplot2)

# 按CRITERION分组计算累积和
testData$CUM_FREQ <- ave(testData$FREQ_RECORDS, testData$CRITERION, FUN = cumsum)

# 绘图
ggplot(data = testData, aes(x = DATE, y = CUM_FREQ, fill = CRITERION)) +
  geom_bar(stat = "identity", position = "dodge", alpha = 0.5, width = 1) +
  theme_minimal()

这样处理后,每个CRITERION组内的累积和就完全符合需求,柱状图也会按分组展示正确的累积数值。

内容的提问来源于stack exchange,提问作者Michael Gruenstaeudl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:42:55