百分比堆积柱状图:从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
相关产品推荐
相关产品推荐

