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
相关产品推荐
相关产品推荐

