生态位宽度计算&可视化展示(R语言)

生态位宽度是指物种(或其它生物单位)在群落中所利用的各种不同资源的总和。
物种的生态位越宽,该物种的特化程度就越小,倾向于泛化种(generalist species);物种的生态位越窄,倾向于是一个特化种(specialists species)。

本篇所使用为生态位宽度指数即**Levins的生态位宽度指数。**

(除此之外也有用shannon指数)

# 安装并加载必要的包
if (!requireNamespace("readxl", quietly = TRUE)) {
  install.packages("readxl")
}
if (!requireNamespace("spaa", quietly = TRUE)) {
  install.packages("spaa")
}
if (!requireNamespace("ggplot2", quietly = TRUE)) {
  install.packages("ggplot2")
}

library(readxl)
library(spaa)
library(ggplot2)

# 读取Excel文件
file_path <- "D:/你的路径/totalGenus.xlsx"
sheets <- excel_sheets(file_path)

# 函数用于计算Levins生态位宽度
levins_niche_width <- function(series) {
  proportions <- series / sum(series)
  niche_width <- 1 / sum(proportions ^ 2)
  return(niche_width)
}

# 遍历每个工作表
for (sheet_name in sheets) {
  # 读取每个工作表
  data <- read_excel(file_path, sheet = sheet_name)
  
  # 去除所有值为0的列
  data_filtered <- data[, colSums(data != 0) > 0]
  
  # 计算每个Genus的生态位宽度
  genus_niche_width <- apply(data_filtered[, -c(1, 2)], 2, levins_niche_width)
  genus_niche_width_weighted <- genus_niche_width / nrow(data_filtered)
  
  # 转换为数据框并过滤掉LevinsIndex为0的结果
  genus_niche_width_df <- data.frame(
    Genus = names(genus_niche_width_weighted),
    LevinsIndex = genus_niche_width_weighted
  )
  genus_niche_width_df <- genus_niche_width_df[genus_niche_width_df$LevinsIndex > 0, ]
  
  # 绘制图表
  p <- ggplot(genus_niche_width_df, aes(x = Genus, y = LevinsIndex, fill = Genus)) +
    geom_bar(stat = "identity") +
    theme_minimal() +
    labs(title = paste("Ecological Niche Width of Each Genus -", sheet_name),
         x = "Genus",
         y = "Weighted Levins Index") +
    theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
    guides(fill = "none")
  
  # 显示图表
  print(p)
  
  # 保存图表
  ggsave(paste0("Ecological_Niche_Width_", sheet_name, ".png"), plot = p, width = 14, height = 8)
}

需要的朋友可以拿走啦(麻烦点个赞谢谢)

补充下我的数据结构

生态位宽度计算&可视化展示(R语言)_第1张图片

你可能感兴趣的:(r语言)