使用ggplot2绘制分站点岗位员工数量条形图报错求助
问题分析与解决方案
你的代码报错核心原因有两个:一是aes里的x参数错误地引用了整个数据框,应该指定为Site列;二是重复调用geom_bar的方式不符合ggplot的语法逻辑,导致变量识别失败,同时会让柱子重叠无法正确展示分组数据。
ggplot更适配长格式数据(tidy data),先把你的宽格式数据转换为长格式,再绘图会更高效且不易出错。
步骤1:加载依赖包并转换数据格式
首先加载tidyverse包(包含ggplot2和数据转换工具),然后将宽格式数据转为长格式:
library(tidyverse) # 转换宽格式数据为长格式 salary_long <- salary_scales_counts_by_site %>% pivot_longer( cols = -Site, # 排除Site列,将其余列转为长格式 names_to = "Job_Role", # 新列:岗位名称 values_to = "Count" # 新列:员工数量 )
步骤2:绘制分组条形图(各岗位并列展示)
这是最常用的展示方式,每个站点下的不同岗位柱子并列:
ggplot(salary_long, aes(x = Site, y = Count, fill = Job_Role)) + geom_bar(stat = "identity", position = position_dodge(width = 0.8)) + # 并列展示 # 自定义各岗位颜色 scale_fill_manual( values = c( "Managing Operator" = "green", "Operations Technician" = "blue", "Process Engineer" = "orange", "Senior Process Engineer" = "purple" ) ) + labs( x = "站点", y = "员工数量", title = "各站点不同岗位员工数量统计", fill = "岗位名称" ) + theme_classic()
步骤3:生成4个独立的岗位图表
如果需要为每个岗位单独生成一张图,不用重复写4次代码,用分面功能即可:
ggplot(salary_long, aes(x = Site, y = Count, fill = Job_Role)) + geom_bar(stat = "identity") + scale_fill_manual( values = c( "Managing Operator" = "green", "Operations Technician" = "blue", "Process Engineer" = "orange", "Senior Process Engineer" = "purple" ) ) + labs( x = "站点", y = "员工数量", title = "各岗位员工数量按站点统计" ) + facet_wrap(~Job_Role, ncol = 2) + # 按岗位分面,生成4个独立图表,每行2个 theme_classic() + theme(legend.position = "none") # 单个图表无需重复显示图例
可选:堆叠条形图
如果需要展示每个站点的总员工数及各岗位占比,可使用堆叠条形图,只需把position = position_dodge()替换为position = "stack"即可:
ggplot(salary_long, aes(x = Site, y = Count, fill = Job_Role)) + geom_bar(stat = "identity", position = "stack") + scale_fill_manual( values = c( "Managing Operator" = "green", "Operations Technician" = "blue", "Process Engineer" = "orange", "Senior Process Engineer" = "purple" ) ) + labs( x = "站点", y = "员工数量", title = "各站点不同岗位员工数量统计", fill = "岗位名称" ) + theme_classic()
内容的提问来源于stack exchange,提问作者CM97
相关产品推荐
相关产品推荐

