如何用ggplot绘制按季节占比配色的鸟类dr值横向条形图
问题原因
- x轴显示计数值的问题:你用
geom_bar(stat="identity")时,ggplot会对同一bird、dr分组下的所有数值做累加计算。你的数据集里每种鸟类对应7行相同的dr值,所以最终x轴显示的是45*7=315、60*7=420的累加结果,不是你需要的原始dr值。 - y轴排序问题:ggplot默认将字符型分类变量的轴按字母倒序排列,要实现从上到下字母正序,需要将
bird列转为指定level顺序的因子。
解决代码
你可以先对数据做汇总,计算每个季节对应色块的长度,再绘图即可:
library(tidyverse) # 1. 汇总数据,计算每个季节的占比和对应色块长度 plot_data <- test %>% # 按鸟类、dr值、季节分组统计观测数 group_by(bird, dr, season) %>% summarise(cnt = n(), .groups = "drop_last") %>% # 按鸟类分组计算各季节占比,再乘以dr得到对应色块的长度 mutate(seg_length = cnt / sum(cnt) * dr) %>% ungroup() # 2. 调整鸟类排序,实现y轴从上到下字母正序 plot_data$bird <- factor(plot_data$bird, levels = rev(sort(unique(plot_data$bird)))) # 3. 绘图 plot <- ggplot(plot_data, aes(x = seg_length, y = bird, fill = season)) + geom_col(position = "stack") + # 把x轴名称改回dr labs(x = "dr") + scale_fill_brewer(palette = "Paired") + theme_minimal()
如果你不想提前汇总数据,也可以直接通过weight参数实现,代码更简洁:
# 调整鸟类排序 test$bird <- factor(test$bird, levels = rev(sort(unique(test$bird)))) plot <- ggplot(test, aes(x = dr, y = bird, fill = season, weight = 1/nrow(.by = bird))) + geom_col() + labs(x = "dr") + scale_fill_brewer(palette = "Paired") + theme_minimal()
内容的提问来源于stack exchange,提问作者user17047272
相关产品推荐
相关产品推荐

