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

如何用R在一张图中绘制多条鱼类物种累积曲线

搞定R语言物种累积曲线:单栖息地+全栖息地同图绘制

嘿,作为R新手碰到这种曲线适配的问题太正常了!我帮你整理了一套能直接套用的代码,你只需要跟着步骤调整自己的数据就行~

第一步:准备好需要的工具包

我们会用到vegan包(群落生态分析的神器,计算物种累积曲线超方便)和ggplot2(用来画出美观的可视化图),先安装加载它们:

# 安装包(第一次使用时运行)
install.packages(c("vegan", "ggplot2", "tidyr"))

# 加载包
library(vegan)
library(ggplot2)
library(tidyr)

第二步:对齐你的数据格式

首先得确保你的数据是宽格式:每一行代表一个采样点,每一列代表一个物种(数值是该物种在这个采样点的个体数/出现次数),还要有一列标注采样点所属的栖息地。如果你的数据是长格式(比如每行是一个物种在一个采样点的记录),可以用tidyr::pivot_wider转换,先看模拟的示例数据:

# 模拟和你场景匹配的数据集(直接替换成你的真实数据即可)
set.seed(123) # 固定随机数,方便你复现结果
# 三个栖息地各10个采样点,每个采样点包含30个物种的记录
habitat_a <- matrix(sample(0:5, 30*10, replace=T), nrow=10)
habitat_b <- matrix(sample(0:5, 30*10, replace=T), nrow=10)
habitat_c <- matrix(sample(0:5, 30*10, replace=T), nrow=10)
# 给物种列命名
colnames(habitat_a) <- paste0("物种", 1:30)
colnames(habitat_b) <- paste0("物种", 1:30)
colnames(habitat_c) <- paste0("物种", 1:30)
# 加上栖息地标签
data_a <- cbind(栖息地=rep("栖息地A",10), habitat_a)
data_b <- cbind(栖息地=rep("栖息地B",10), habitat_b)
data_c <- cbind(栖息地=rep("栖息地C",10), habitat_c)
# 合并成全栖息地的总数据
all_data <- rbind(data_a, data_b, data_c)

# 如果你的数据是长格式,用下面代码转成宽格式
# 假设长格式数据叫long_data,列名是:采样点ID、栖息地、物种、个体数
# wide_data <- pivot_wider(long_data, 
#                          id_cols = c(采样点ID, 栖息地), 
#                          names_from = 物种, 
#                          values_from = 个体数,
#                          values_fill = 0) # 把未出现的物种填充为0

第三步:计算四条物种累积曲线

用vegan的specaccum函数计算,它会自动统计随着采样点增加,物种数的累积变化:

# 1. 全栖息地的累积曲线
all_accum <- specaccum(all_data[, -1], method = "random") # 去掉栖息地列,用随机抽样方法
# 2. 栖息地A的累积曲线
a_accum <- specaccum(data_a[, -1], method = "random")
# 3. 栖息地B的累积曲线
b_accum <- specaccum(data_b[, -1], method = "random")
# 4. 栖息地C的累积曲线
c_accum <- specaccum(data_c[, -1], method = "random")

第四步:整理数据用于绘图

把四个曲线的结果整理成统一的数据框,方便ggplot一次性绘制所有曲线:

# 定义函数批量提取累积曲线结果
extract_accum <- function(accum_obj, group_name) {
  data.frame(
    采样点数量 = accum_obj$sites,
    物种数量 = accum_obj$richness,
    标准差 = accum_obj$sd,
    分组 = group_name
  )
}

# 提取所有曲线的数据
all_df <- extract_accum(all_accum, "所有栖息地")
a_df <- extract_accum(a_accum, "栖息地A")
b_df <- extract_accum(b_accum, "栖息地B")
c_df <- extract_accum(c_accum, "栖息地C")

# 合并成绘图用的总数据框
plot_data <- rbind(all_df, a_df, b_df, c_df)

第五步:用ggplot画出美观的图

现在可以画出四条曲线,还能加上标准差阴影区间让图更专业:

ggplot(plot_data, aes(x = 采样点数量, y = 物种数量, color = 分组)) +
  # 绘制累积曲线
  geom_line(linewidth = 1) +
  # 绘制标准差的阴影区间(不想加可以删掉这一行)
  geom_ribbon(aes(ymin = 物种数量 - 标准差, ymax = 物种数量 + 标准差, fill = 分组), 
              alpha = 0.2, color = NA) +
  # 设置坐标轴标签和标题
  labs(x = "采样点数量", y = "累积物种数", 
       title = "不同栖息地的鱼类物种累积曲线",
       color = "栖息地分组", fill = "栖息地分组") +
  # 设置主题让图更清晰
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))

小提示

  • 如果不同栖息地的采样点数量不一样,specaccum会自动适配处理
  • 可以用scale_color_manual自定义曲线颜色,比如scale_color_manual(values = c("red", "blue", "green", "purple"))
  • 不需要标准差阴影的话,直接删除geom_ribbon代码块即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:12:40