如何按月份统计各类群存在/缺失情况并绘制ggplot柱状图?
解决方案
1. 数据汇总:按月统计类群存在/缺失
你的需求是按月判断每个类群是否存在(即该月份至少有一条鱼的胃中包含此类群),可以通过分组后取最大值实现(只要该月份有1条鱼的类群值为1,最大值就是1,代表存在;全为0则最大值为0,代表缺失)。
首先加载所需包:
library(dplyr) library(tidyr) library(ggplot2)
然后对数据进行分组汇总:
# 按月份分组,对每个类群列取最大值 monthly_presence <- df %>% # 保留月份和所有类群列(排除id、totalnumPrey、empty等非类群列) select(MONTH, Daphnia:Eurycercidae) %>% group_by(MONTH) %>% # 对每个类群列计算最大值,判断该月份是否存在 summarize(across(everything(), max, na.rm = TRUE)) %>% # 重命名月份列 rename(月份 = MONTH) # 查看结果 monthly_presence
执行后会得到你期望的宽格式汇总表,对应你的数据的示例输出:
| 月份 | Daphnia | Byths | Chiro.Pupae | Isopod | Goby |
|---|---|---|---|---|---|
| 6 | 0 | 1 | 1 | 0 | 0 |
| 7 | 1 | 1 | 0 | 0 | 0 |
| 8 | 0 | 1 | 1 | 0 | 0 |
| 11 | 0 | 0 | 0 | 0 | 1 |
2. 转换为长格式(方便ggplot绘图)
ggplot更适合长格式数据,所以需要将宽格式转换为长格式:
long_data <- monthly_presence %>% pivot_longer(cols = -月份, names_to = "类群", values_to = "存在状态") %>% # 过滤掉始终为0的类群(可选,减少冗余) filter(存在状态 == 1)
3. 绘制柱状图
参考你提供的示例图,我们可以绘制分面柱状图,每个月份为一个分面,展示该月份存在的类群:
ggplot(long_data, aes(x = 类群, y = 存在状态)) + geom_bar(stat = "identity", fill = "#2E8B57") + # 按月份分面 facet_wrap(~月份, ncol = 2) + # 调整坐标轴和标签 labs(x = "类群", y = "存在状态", title = "鱼类胃容物类群按月存在情况") + theme_bw() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
如果需要将所有月份的类群并列展示,也可以调整为:
ggplot(long_data, aes(x = factor(月份), y = 存在状态, fill = 类群)) + geom_bar(stat = "identity", position = "dodge") + labs(x = "月份", y = "存在状态", title = "鱼类胃容物类群按月存在情况") + theme_bw()
补充说明
- 如果你使用
data.table处理数据,也可以用类似逻辑:
library(data.table) setDT(df) monthly_presence_dt <- df[, lapply(.SD, max, na.rm = TRUE), by = MONTH, .SDcols = Daphnia:Eurycercidae] setnames(monthly_presence_dt, "MONTH", "月份")
内容的提问来源于stack exchange,提问作者FishyFishies
相关产品推荐
相关产品推荐

