不同样本的各功能群落的香农指数(Shannon)和辛普森指数(Simpson)的计算(Python)
不同样本的各功能群落的香农指数(Shannon)和辛普森指数(Simpson)的计算(Python)
生物多样性指数是描述生态系统中物种多样性的重要指标,其中香农指数(Shannon Index)和辛普森指数(Simpson Index)是两个经典的测量方法。香农指数反映了物种丰富度和均匀度,辛普森指数则更注重样本中占主导地位的物种对多样性的影响。
本文通过 Python 示例讲解如何计算不同样本中各功能群落的香农指数和辛普森指数,同时配以图解和详细说明,帮助你轻松理解与实践。
一、理论基础
1. 香农指数(Shannon Index)
香农指数公式如下:
\[
H = -\sum_{i=1}^S p_i \ln(p_i)
\]
- (S):样本中的物种总数。
- (p_i):第 (i) 种物种的相对丰度,即 (p_i = \frac{n_i}{N}),其中 (n_i) 是第 (i) 种物种的个体数,(N) 是总个体数。
2. 辛普森指数(Simpson Index)
辛普森指数公式如下:
\[
D = 1 - \sum_{i=1}^S p_i^2
\]
- (D):多样性指数,数值越大表示多样性越高。
两者的核心思想均是基于物种的相对丰度计算。
二、准备数据
我们以一个假设数据集为例,该数据集中包含三个样本,每个样本中有不同物种的丰度值。
import pandas as pd
# 假设数据集
data = {
"Sample": ["Sample1", "Sample2", "Sample3"],
"Species_A": [10, 0, 15],
"Species_B": [20, 5, 5],
"Species_C": [30, 10, 0],
"Species_D": [40, 85, 30]
}
# 转换为 DataFrame
df = pd.DataFrame(data)
df.set_index("Sample", inplace=True)
print(df)
数据表如下:
Sample | Species_A | Species_B | Species_C | Species_D |
---|---|---|---|---|
Sample1 | 10 | 20 | 30 | 40 |
Sample2 | 0 | 5 | 10 | 85 |
Sample3 | 15 | 5 | 0 | 30 |
三、计算香农指数(Shannon Index)
以下代码展示如何计算香农指数:
import numpy as np
def calculate_shannon_index(row):
# 转换为相对丰度
proportions = row / row.sum()
# 滤除零值以避免 log(0) 的错误
proportions = proportions[proportions > 0]
# 计算香农指数
shannon_index = -np.sum(proportions * np.log(proportions))
return shannon_index
# 对每个样本计算香农指数
df["Shannon_Index"] = df.apply(calculate_shannon_index, axis=1)
print(df[["Shannon_Index"]])
输出结果
Sample | Shannon_Index |
---|---|
Sample1 | 1.27985 |
Sample2 | 0.61086 |
Sample3 | 1.03972 |
四、计算辛普森指数(Simpson Index)
以下代码展示如何计算辛普森指数:
def calculate_simpson_index(row):
# 转换为相对丰度
proportions = row / row.sum()
# 计算辛普森指数
simpson_index = 1 - np.sum(proportions ** 2)
return simpson_index
# 对每个样本计算辛普森指数
df["Simpson_Index"] = df.apply(calculate_simpson_index, axis=1)
print(df[["Simpson_Index"]])
输出结果
Sample | Simpson_Index |
---|---|
Sample1 | 0.69500 |
Sample2 | 0.20905 |
Sample3 | 0.61111 |
五、数据可视化
为了更直观地对比不同样本的香农指数和辛普森指数,我们使用 Matplotlib 绘制条形图。
import matplotlib.pyplot as plt
# 可视化
x = df.index
shannon = df["Shannon_Index"]
simpson = df["Simpson_Index"]
fig, ax = plt.subplots(1, 2, figsize=(12, 5))
# 绘制香农指数
ax[0].bar(x, shannon, color='skyblue')
ax[0].set_title("Shannon Index")
ax[0].set_ylabel("Index Value")
ax[0].set_xlabel("Samples")
# 绘制辛普森指数
ax[1].bar(x, simpson, color='lightgreen')
ax[1].set_title("Simpson Index")
ax[1].set_ylabel("Index Value")
ax[1].set_xlabel("Samples")
plt.tight_layout()
plt.show()
图示
- 左图(香农指数):显示各样本物种多样性的均匀性和丰富性。
- 右图(辛普森指数):反映样本中占主导物种对多样性的影响。
六、结果分析
Sample1:
- 香农指数较高,说明物种丰富且分布较均匀。
- 辛普森指数较高,说明没有某种物种过度占主导。
Sample2:
- 香农指数较低,说明物种丰富度低且分布不均。
- 辛普森指数最低,主要由物种 D 占据绝大多数丰度导致。
Sample3:
- 香农指数和辛普森指数介于 Sample1 和 Sample2 之间,物种丰富度适中。
七、总结
通过本教程,我们学会了如何用 Python 计算不同样本的香农指数和辛普森指数,并借助数据可视化直观呈现结果:
- 香农指数适合评估物种的均匀性和丰富度。
- 辛普森指数更注重主导物种对多样性的影响。
两者结合使用,可以更全面地分析样本的多样性特征。在实际生态学和生物统计分析中,这些工具将发挥重要作用。
希望本教程对你有所帮助!如果有其他问题或想了解的内容,欢迎随时交流!
评论已关闭