ggplot绘图需求:将堆叠柱状图Y轴从计数改为平均时长
修改堆叠柱状图为显示平均时长的方法
嘿,这问题挺常见的,我给你两种实用的解决方案,你可以根据自己的习惯选:
方法1:直接在ggplot中计算均值(无需提前汇总)
原代码里的geom_bar()默认是统计每组的计数,要改成显示平均时长,我们需要明确告诉ggplot要计算duration的均值,并用柱状图展示。可以用stat_summary()来实现:
library(ggplot2) ggplot(data2, aes(x = factor(week), y = duration, fill = question)) + stat_summary(fun = mean, geom = "col", position = "stack") + xlab("Week") + ylab("Average Duration") # 别忘了给Y轴加个明确的标签
关键点说明:
- 把
x = week改成x = factor(week),让周次作为离散的分类变量(避免被当成连续数值处理) - 在
aes()里加入y = duration,指定我们要计算的目标变量 stat_summary(fun = mean)告诉ggplot用均值函数来汇总数据geom = "col"指定用柱状图展示结果,position = "stack"保持堆叠效果
方法2:先手动汇总数据再绘图(更清晰可控)
如果你喜欢先把数据整理清楚再绘图,用dplyr提前计算每周每个问题的平均时长会更直观,也方便后续做其他调整:
library(ggplot2) library(dplyr) # 第一步:分组计算平均时长 summary_data <- data2 %>% group_by(week, question) %>% summarise(avg_duration = mean(duration), .groups = "drop") # 第二步:用汇总后的数据绘图 ggplot(summary_data, aes(x = factor(week), y = avg_duration, fill = question)) + geom_col(position = "stack") + xlab("Week") + ylab("Average Duration")
为什么这种方法更好?
提前汇总数据后,你可以随时查看计算结果是否正确,而且如果后续需要添加标准差、置信区间之类的元素,也更容易扩展。
内容的提问来源于stack exchange,提问作者D. Studer
相关产品推荐
相关产品推荐

