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

如何用ggplot绘制按季节占比配色的鸟类dr值横向条形图

问题原因

  1. x轴显示计数值的问题:你用geom_bar(stat="identity")时,ggplot会对同一bird、dr分组下的所有数值做累加计算。你的数据集里每种鸟类对应7行相同的dr值,所以最终x轴显示的是45*7=315、60*7=420的累加结果,不是你需要的原始dr值。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:06:04