如何在R语言中使用ggplot2绘制时间序列分组柱状图?
解决ggplot2分组柱状图显示为堆叠图的问题
你的问题核心在于数据格式不匹配以及多图层调用geom_bar的方式错误:ggplot2更适合处理长格式数据,而你的原始数据是宽格式;同时多次调用geom_bar时,每个图层的position="dodge"只会作用于当前图层的元素,无法实现跨系列的分组。
正确实现步骤
- 转换数据格式:用
tidyr::pivot_longer把宽格式数据转为长格式,将great_deal、only_some等列合并为一个类别变量(比如命名为response_type),对应数值放在另一列(比如count)。 - 单图层绘制分组柱状图:基于长格式数据,用一次
geom_bar,通过fill映射类别变量,同时设置position="dodge"实现分组。
完整代码示例
# 加载必要包 library(tidyverse) # 假设你的数据框是confinan,转换为长格式 confinan_long <- confinan %>% pivot_longer( cols = c(great_deal, only_some, dont_know, # 替换成你实际的四列名称 not_a_deal), # 这里补充第四列的实际名称 names_to = "response_type", values_to = "count" ) # 绘制分组柱状图 ggplot(confinan_long, aes(x = year, y = count, fill = response_type)) + geom_bar(stat = "identity", position = position_dodge(width = 0.9)) + labs( title = "各年份不同反馈类型的数量", x = "年份", y = "数量", fill = "反馈类型" ) + theme_minimal()
关键说明
position_dodge(width = 0.9):手动设置分组柱子的间距,让分组更紧凑(默认width是0.9,可按需调整)。- 务必确保
cols参数里包含你所有要展示的四列名称,避免漏掉数据系列。 - 如果不需要额外的主题和标签,可以去掉
labs和theme_minimal()部分。
内容的提问来源于stack exchange,提问作者James Rider
相关产品推荐
相关产品推荐

