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

百分比堆积柱状图:从Excel迁移至R的ggplot2实现

问题解答

数据集情况

你的数据集没有问题,MM和FF列分别记录了每个巢箱中雄性、雌性寄生虫的数量,N.(Carnus)是对应巢箱的寄生虫总数,数据完整且逻辑自洽(比如巢箱5(b)的MM=1、FF=2,总数3,和你描述的一致)。

代码问题及修正方案

你的代码主要问题在于数据格式不符合ggplot的要求,以及aes映射、图层调用的错误,具体修正步骤如下:

1. 转换数据为长格式

ggplot绘制分组堆积图需要长格式数据(把MM、FF合并为一个"性别"列,数量合并为一个"计数"列),可以用tidyr::pivot_longer完成转换:

# 先加载tidyverse包(包含ggplot2和tidyr)
library(tidyverse)

# 转换数据格式
broods_long <- broods_2020 %>%
  pivot_longer(cols = c(MM, FF), 
               names_to = "Sex", 
               values_to = "Count")

2. 正确绘制百分比堆积柱状图

修正后的代码去掉了重复的图层,正确设置了aes映射和颜色,调整了主题:

ggplot(broods_long, aes(x = `Nest-box.number.(x.brood)`, y = Count, fill = Sex)) +
  geom_bar(position = "fill", stat = "identity") +
  # 自定义颜色:MM设为蓝色,FF设为红色
  scale_fill_manual(values = c("MM" = "#290DFB", "FF" = "#FF0000")) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  labs(x = "Nest box", 
       y = "Collected Carnus hemapterus (%)", 
       title = "2020 - PARASITE SEX RATIO (per brood)") +
  theme(
    axis.line = element_line(colour = 'black', size = 0.5),
    title = element_text(face = "plain", size = 12),
    plot.title = element_text(hjust = 0.5, vjust = 2),
    axis.text.x = element_text(angle = 45, hjust = 1),
    panel.background = element_blank()
  )

关键修正点说明

  • 不再用data$column的方式在aes里引用变量,直接使用列名,符合ggplot的语法规范。
  • fill映射的是新生成的Sex列(MM/FF),而不是原来的总数列,这样才能按性别区分填充色。
  • 使用position = "fill"让柱状图按百分比堆积,自动计算每个性别在巢箱中的占比。
  • 用scale_fill_manual统一设置MM和FF的颜色,避免图层调用错误。
  • 合并了重复的theme设置,让代码更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:01:01