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

ggplot2绘制柱状图出现柱体重合问题的原因及解决方法

问题原因

  • 核心原因是数据处理后同一个bird分类对应了多条记录:你在group_by(bird)后执行summarise(key = unique(dr))时,如果单个bird分组下存在多个不同的dr值,unique(dr)会返回多个结果,导致summarise操作后同一个bird会生成多行数据。ggplot的geom_bar(stat="identity")默认会对同x轴分类的多个y值做堆叠展示,视觉上就会出现柱体合并/变粗的效果。
  • 次要问题是填充色设置逻辑错误:你把fill="lightblue"写在了aes()内部,相当于将fill映射到一个固定字符串常量,而非手动指定填充色,虽然这不是柱体合并的直接原因,但也不符合你的代码预期。

解决方法

  1. 先修正数据处理逻辑,保证每个bird分类仅对应一条记录
    你可以先对原始数据做去重处理,再执行统计,同时确认每个bird对应的key取值逻辑:
# 先按bird和dr去重,避免单个bird对应多个dr值
test_clean <- test %>% 
  distinct(bird, dr, .keep_all = TRUE)

# 后续统计逻辑,确保每个bird仅生成一行结果
processed_data <- test_clean %>%
  group_by(bird) %>%
  summarise(
    key = first(dr), # 可根据实际需求替换为max/min等取唯一值的函数
    dr_sum = sum(dr)
  ) %>%
  mutate(
    dr = dr_sum/sum(dr_sum) * key,
    bird = fct_reorder(bird, desc(bird))
  )

# 先验证数据行数和bird分类数是否一致,一致再绘图
stopifnot(nrow(processed_data) == length(unique(processed_data$bird)))
  1. 修正绘图代码的fill设置,把固定填充色参数移到aes()外部:
bird_plot_fixed <- processed_data %>%
  ggplot(aes(x=bird, y=dr)) +
  geom_bar(stat="identity", fill="lightblue")+
  theme_classic() +
  theme(legend.position="none")+
  coord_flip() +
  ylim(0, 0.8) +
  ggtitle("Detection rate by bird") +
  xlab("Bird") + 
  ylab("Detection rate")

内容的提问来源于stack exchange,提问作者user17047272

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:36:03