在R语言中基于聚合数据绘制分组条形图的技术求助
解决分组条形图绘制问题及优化建议
问题根源
你用table()函数的方式不对,这个函数是用来生成频数交叉统计表的,不是直接转换现有数值列的结构,所以得到的结果不符合预期。
基础R(base R)解决方案
假设你的数据结构是这样的(三列:燃料类型、2018年数量、2021年数量):
# 模拟你的数据结构 fuel_trend <- data.frame( fuel_type = c("汽油", "柴油", "电动", "混动"), `2018` = c(1000, 800, 150, 200), `2021` = c(900, 700, 500, 350) )
正确的做法是把年份列转换成矩阵,行名设为燃料类型,再用barplot()绘制:
# 提取年份列并转为矩阵,行名设为燃料类型 plot_data <- as.matrix(fuel_trend[, c("2018", "2021")]) rownames(plot_data) <- fuel_trend$fuel_type # 绘制分组条形图 barplot(plot_data, beside = TRUE, # 并排展示分组 col = c("#2E86AB", "#F24C4C"), # 自定义颜色 main = "各燃料类型车辆数量变化(2018 vs 2021)", xlab = "燃料类型", ylab = "车辆数量", legend.text = colnames(plot_data), # 添加图例 args.legend = list(x = "topright") # 图例位置 )
更优可视化方案:用ggplot2绘制
ggplot2在灵活性和美观度上更有优势,需要先把数据转成长格式(tidy data):
- 先安装并加载所需包:
install.packages(c("ggplot2", "tidyr")) library(ggplot2) library(tidyr)
- 转换数据格式并绘图:
# 把宽格式数据转为长格式 fuel_trend_long <- pivot_longer(fuel_trend, cols = c("2018", "2021"), names_to = "年份", values_to = "车辆数量") # 绘制分组条形图 ggplot(fuel_trend_long, aes(x = fuel_type, y = 车辆数量, fill = 年份)) + geom_col(position = position_dodge(width = 0.8), width = 0.7) + # 分组并排 geom_text(aes(label = 车辆数量), # 添加数值标签 position = position_dodge(width = 0.8), vjust = -0.5, size = 3.5) + scale_fill_manual(values = c("#2E86AB", "#F24C4C")) + # 自定义颜色 labs(title = "各燃料类型车辆数量变化(2018 vs 2021)", x = "燃料类型", y = "车辆数量") + theme_minimal() + # 简洁主题 theme(plot.title = element_text(hjust = 0.5)) # 标题居中
额外可视化建议
- 排序条形:可以按2021年的车辆数量对燃料类型排序,让图表更易读,比如在ggplot2里用
x = reorder(fuel_type, -车辆数量) - 调整坐标轴:如果数值差距大,可考虑用对数坐标轴(
scale_y_log10()),但需注意说明 - 添加误差线:如果有标准差等统计数据,可叠加误差线展示数据波动
- 配色优化:使用色盲友好的配色方案,比如
scale_fill_viridis_d()
内容的提问来源于stack exchange,提问作者adam
相关产品推荐
相关产品推荐

