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

如何按月份统计各类群存在/缺失情况并绘制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

执行后会得到你期望的宽格式汇总表,对应你的数据的示例输出:

月份DaphniaBythsChiro.PupaeIsopodGoby
601100
711000
801100
1100001

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:24:21