Python 3.12 植物分类数据可视化实战:用 Pandas 和 Matplotlib 解析 1000+ 物种特征
植物分类学与数据科学的碰撞总能产生令人惊喜的火花。当古老的植物学遇上现代的Python数据分析工具,枯燥的分类特征突然变得生动起来。本文将带你用Pandas和Matplotlib这两个强大的Python库,将复杂的植物分类数据转化为直观的可视化图表,让数据自己讲述植物进化的故事。
1. 环境准备与数据获取
在开始我们的植物分类数据分析之旅前,需要确保Python环境已准备就绪。推荐使用Python 3.12的最新特性,它能带来更好的性能和更简洁的语法表达。
首先安装必要的库:
pip install pandas matplotlib seaborn numpy scipy
植物分类数据可以从多个公开数据库获取:
- GBIF (全球生物多样性信息设施):提供全球范围的物种分布数据
- Tropicos :密苏里植物园维护的植物数据库
- Kew Gardens :英国皇家植物园的植物数据库
这里我们使用一个包含1000+植物物种特征的合成数据集,包含以下关键字段:
| 字段名 | 数据类型 | 描述 |
|---|---|---|
| species_name | string | 物种学名 |
| family | string | 植物科属 |
| leaf_count | int | 叶片数量 |
| vein_type | string | 叶脉类型(平行/网状) |
| seed_coverage | string | 种子覆盖类型(裸子/被子) |
| flower_presence | bool | 是否有花 |
| height_cm | float | 平均高度(厘米) |
import pandas as pd
# 加载数据集
plant_data = pd.read_csv('plant_species_characteristics.csv')
print(plant_data.info())
2. 数据清洗与特征工程
原始数据往往不够完美,需要进行清洗和预处理才能用于分析。植物分类数据常见的质量问题包括:
- 缺失值处理 :某些物种的特征可能不完整
- 异常值检测 :记录错误导致的极端数值
- 分类编码 :将文本特征转换为数值表示
# 处理缺失值
plant_data = plant_data.dropna(subset=['seed_coverage', 'vein_type'])
# 创建新特征:植物类别(裸子/被子)
plant_data['plant_type'] = plant_data['seed_coverage'].map({
'naked': 'gymnosperm',
'covered': 'angiosperm'
})
# 将叶脉类型编码为数值
vein_mapping = {'parallel': 0, 'reticulate': 1}
plant_data['vein_encoded'] = plant_data['vein_type'].map(vein_mapping)
重要特征统计 :
# 统计不同植物类别的数量
type_counts = plant_data['plant_type'].value_counts()
print(type_counts)
# 被子植物中各科的数量分布
angiosperm_families = plant_data[plant_data['plant_type'] == 'angiosperm']['family'].value_counts().head(10)
print(angiosperm_families)
3. 基础可视化:探索植物分类特征
有了干净的数据,我们可以开始用Matplotlib创建各种图表来探索植物分类特征。先从一些基础图表开始,逐步深入。
3.1 植物类别分布
import matplotlib.pyplot as plt
# 设置图表样式
plt.style.use('seaborn')
# 植物类别分布饼图
type_counts.plot.pie(autopct='%1.1f%%', explode=[0, 0.1],
colors=['#66b3ff','#99ff99'])
plt.title('裸子植物与被子植物比例')
plt.ylabel('')
plt.show()
3.2 叶脉类型与植物类别的关系
# 创建交叉表
vein_type_cross = pd.crosstab(plant_data['vein_type'],
plant_data['plant_type'])
# 绘制堆叠柱状图
vein_type_cross.plot.bar(stacked=True, color=['#ff9999','#66b3ff'])
plt.title('叶脉类型在不同植物类别中的分布')
plt.xlabel('叶脉类型')
plt.ylabel('数量')
plt.xticks(rotation=0)
plt.show()
关键发现 :
- 网状叶脉几乎只存在于被子植物中
- 平行叶脉在两类植物中都有分布,但在被子植物中更常见
4. 高级可视化:多维特征分析
基础图表揭示了简单的分布规律,而要理解更复杂的特征关系,我们需要更高级的可视化技术。
4.1 散点图矩阵
from pandas.plotting import scatter_matrix
# 选择数值型特征
numeric_features = plant_data.select_dtypes(include=['int64','float64'])
# 绘制散点图矩阵
scatter_matrix(numeric_features, figsize=(12, 12), diagonal='kde')
plt.suptitle('数值特征关系矩阵', y=1.02)
plt.show()
4.2 热力图:科属与特征关系
import seaborn as sns
# 选择前20个最常见的科
top_families = plant_data['family'].value_counts().head(20).index.tolist()
family_subset = plant_data[plant_data['family'].isin(top_families)]
# 创建透视表
family_pivot = family_subset.pivot_table(index='family',
columns='plant_type',
values='height_cm',
aggfunc='mean')
# 绘制热力图
plt.figure(figsize=(12, 8))
sns.heatmap(family_pivot, annot=True, cmap='YlGnBu', linewidths=.5)
plt.title('各科植物在不同类别中的平均高度')
plt.show()
5. 分类特征深度解析
植物分类学的核心在于理解不同类群的特征差异。让我们用数据可视化来探索这些差异。
5.1 单子叶与双子叶植物比较
# 筛选被子植物
angiosperms = plant_data[plant_data['plant_type'] == 'angiosperm']
# 根据子叶数量分类
angiosperms['cotyledon_type'] = angiosperms['leaf_count'].apply(
lambda x: 'monocot' if x % 2 == 1 else 'dicot')
# 绘制箱线图比较特征分布
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
features_to_compare = ['height_cm', 'leaf_count', 'vein_encoded']
for i, feature in enumerate(features_to_compare):
ax = axes[i//2, i%2]
sns.boxplot(x='cotyledon_type', y=feature, data=angiosperms, ax=ax)
ax.set_title(f'{feature} 分布比较')
plt.tight_layout()
plt.show()
5.2 特征重要性分析
from sklearn.ensemble import RandomForestClassifier
# 准备特征和目标变量
X = plant_data[['leaf_count', 'vein_encoded', 'height_cm']]
y = plant_data['plant_type']
# 训练随机森林模型
model = RandomForestClassifier()
model.fit(X, y)
# 获取特征重要性
importance = pd.DataFrame({
'feature': X.columns,
'importance': model.feature_importances_
}).sort_values('importance', ascending=False)
# 绘制重要性条形图
plt.figure(figsize=(10, 6))
sns.barplot(x='importance', y='feature', data=importance, palette='Blues_d')
plt.title('分类特征重要性排序')
plt.show()
6. 交互式可视化进阶
静态图表适合展示固定视角的数据,而交互式可视化能让探索更加灵活。
6.1 使用Plotly创建交互图表
import plotly.express as px
# 创建交互式散点图
fig = px.scatter(plant_data, x='height_cm', y='leaf_count',
color='plant_type', hover_name='species_name',
size='height_cm', log_x=True,
title='植物高度与叶片数量关系')
fig.show()
6.2 3D特征空间可视化
# 创建3D散点图
fig = px.scatter_3d(plant_data, x='height_cm', y='leaf_count',
z='vein_encoded', color='plant_type',
symbol='flower_presence',
title='植物特征3D空间分布')
fig.update_layout(margin=dict(l=0, r=0, b=0, t=30))
fig.show()
7. 完整分析流程与自动化
将上述分析步骤整合到一个可重复的流程中,可以大大提高效率。
7.1 创建分析管道
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
# 构建分析管道
analysis_pipe = Pipeline([
('scaler', StandardScaler()),
('pca', PCA(n_components=2)),
])
# 应用管道并可视化结果
X_transformed = analysis_pipe.fit_transform(X)
plt.scatter(X_transformed[:, 0], X_transformed[:, 1],
c=pd.factorize(y)[0], alpha=0.6)
plt.title('植物特征PCA降维可视化')
plt.xlabel('主成分1')
plt.ylabel('主成分2')
plt.show()
7.2 自动化报告生成
from pandas_profiling import ProfileReport
# 生成自动化分析报告
profile = ProfileReport(plant_data, title='植物分类数据集分析报告')
profile.to_file('plant_classification_report.html')
在实际项目中,我发现将植物学知识与数据分析技术结合,不仅能验证传统分类学的结论,还能发现一些有趣的异常模式和潜在的新关系。比如通过数据聚类分析,有时会发现某些物种的分类位置可能需要重新审视。

239

被折叠的 条评论
为什么被折叠?



