You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:15:20