ggplot绘制按sex填充的物种数量柱状图报stat_count错误求助
错误原因
geom_bar()默认使用stat = "count"统计逻辑,功能是自动统计x轴分组对应的原始数据行数,不需要额外指定y轴映射,因此同时指定x、y、fill三个映射时就会触发你遇到的报错。
你使用的surveys_by_species是已经按species_id和sex分组统计好计数n的汇总数据集,不需要ggplot再自动统计行数。
解决方案
有两种可行写法:
写法1:保留geom_bar(),手动指定统计规则
给geom_bar()添加stat = "identity"参数,明确要求直接使用你提供的y轴n值作为柱子高度:
library(ggplot2) library(forcats) ggplot(data = surveys_by_species, mapping = aes(x = fct_reorder(species_id, n, .desc = TRUE), y = n, fill = sex)) + geom_bar(stat = "identity") + theme(axis.text.x = element_text(angle = 45, hjust = 1))
写法2:使用更适配汇总数据的geom_col()
geom_col()默认的统计规则就是stat = "identity",直接复用你之前成功运行的初始代码,仅添加fill = sex映射即可:
library(ggplot2) library(forcats) ggplot(data = surveys_by_species, mapping = aes(x = fct_reorder(species_id, n, .desc = TRUE), y = n, fill = sex)) + geom_col() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
可选调整
如果需要生成同物种下性别并列的柱状图,而非默认的堆叠效果,给geom_col()/geom_bar()添加position = "dodge"参数即可:
# 并列柱状图示例 ggplot(data = surveys_by_species, mapping = aes(x = fct_reorder(species_id, n, .desc = TRUE), y = n, fill = sex)) + geom_col(position = "dodge") + theme(axis.text.x = element_text(angle = 45, hjust = 1))
内容的提问来源于stack exchange,提问作者Maze NF
相关产品推荐
相关产品推荐

