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映射到一个固定字符串常量,而非手动指定填充色,虽然这不是柱体合并的直接原因,但也不符合你的代码预期。
解决方法
- 先修正数据处理逻辑,保证每个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)))
- 修正绘图代码的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
相关产品推荐
相关产品推荐

