如何用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
相关产品推荐
相关产品推荐

