如何使用ggplot将两个柱状图合并为分组柱状图
解决ggplot绘制并列分组柱状图的错误问题
你遇到的Error: Discrete value supplied to continuous scale错误,根源是把离散型变量放到了指定为连续刻度的轴上:你将离散的分类名称salaries.ClassificationName放在y轴,却用scale_y_continuous()强制设置连续刻度,两者直接冲突。
另外,手动用两个geom_bar调整位置的做法不够规范,ggplot更推荐通过数据格式转换来实现分组并列柱状图,这是更简洁且不易出错的方式。
正确解决步骤
1. 将宽格式数据转换为长格式
ggplot对长格式数据的支持更好,我们需要把women_salary和men_salary两列合并为“薪资值”列,同时新增“性别”列来区分分组:
# 先加载tidyr包(未安装的话先运行 install.packages("tidyr")) library(tidyr) library(dplyr) # 用于管道操作,可选但更方便 long_salaries <- by_div_salaries %>% pivot_longer( cols = c(women_salary, men_salary), # 指定要转换的薪资列 names_to = "gender", # 新建分组列的名称 values_to = "salary" # 新建薪资值列的名称 ) %>% # 优化性别列的显示文本(去掉_salary后缀) mutate(gender = gsub("_salary", "", gender))
2. 绘制分组并列柱状图
用转换后的长数据,通过fill映射性别分组,搭配position_dodge()实现柱子并列:
library(ggplot2) ggplot(long_salaries, aes(x = salaries.ClassificationName, y = salary, fill = gender)) + geom_bar(stat = "identity", position = position_dodge(width = 0.8), width = 0.7) + # 设置标题和坐标轴标签 labs( title = "男女主教练薪资对比(按分类)", x = "分类名称", y = "薪资", fill = "性别" ) + # 自定义颜色(对应你之前用的蓝绿) scale_fill_manual(values = c("men" = "blue", "women" = "green")) + # 可选:调整主题让图表更美观 theme_minimal()
为什么之前的代码出错?
scale_y_continuous()是给数值型变量设置连续刻度的,但你的y轴是离散的分类名称,应该用scale_y_discrete()(或者不手动指定,ggplot会自动识别)。- 手动用
position_nudge调整两个柱子的位置容易出现对齐问题,且不符合ggplot的“数据驱动”设计思路,转换数据格式后逻辑更清晰。
内容的提问来源于stack exchange,提问作者runnergirl229
相关产品推荐
相关产品推荐

