Python数据可视化实战:用Iris数据集教你玩转散点图、直方图与箱线图(附完整代码)
·
Python数据可视化实战:用Iris数据集玩转三大基础图表
鸢尾花数据集(Iris)就像数据科学界的"Hello World",150朵鸢尾花的测量数据包含了花萼长度、花萼宽度、花瓣长度和花瓣宽度四个特征。这个经典数据集不仅是机器学习入门的标配,更是数据可视化的绝佳练手材料。今天我们就用这个数据集,带你玩转Python中最实用的三种基础图表——散点图、直方图和箱线图。无论你是刚接触Python的数据分析新手,还是想巩固可视化基础的中级开发者,这篇实战指南都能让你快速掌握这些核心技能。
1. 环境准备与数据加载
1.1 安装必要库
在开始之前,确保你的Python环境已经安装了以下核心库:
pip install numpy pandas matplotlib seaborn scikit-learn
小技巧:如果你使用Jupyter Notebook,可以在代码单元格开头添加%matplotlib inline魔法命令,让图表直接显示在笔记本中。
1.2 加载Iris数据集
从scikit-learn加载数据集是最简单的方式:
from sklearn import datasets
import pandas as pd
# 加载数据集
iris = datasets.load_iris()
# 转换为DataFrame
df = pd.DataFrame(iris.data, columns=iris.feature_names)
# 添加目标列
df['species'] = [iris.target_names[i] for i in iris.target]
检查数据前五行:
print(df.head())
输出示例:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
2. 散点图:探索特征间关系
2.1 基础散点图绘制
散点图是探索两个连续变量关系的首选工具。让我们看看花萼长度和宽度的关系:
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 6))
plt.scatter(df['sepal length (cm)'], df['sepal width (cm)'], c='blue', alpha=0.5)
plt.title('花萼长度 vs 花萼宽度')
plt.xlabel('花萼长度 (cm)')
plt.ylabel('花萼宽度 (cm)')
plt.grid(True)
plt.show()
2.2 分类着色散点图
更高级的做法是按鸢尾花种类着色:
colors = {'setosa':'red', 'versicolor':'green', 'virginica':'blue'}
plt.figure(figsize=(10, 8))
for species, group in df.groupby('species'):
plt.scatter(group['petal length (cm)'],
group['petal width (cm)'],
color=colors[species],
label=species,
alpha=0.7)
plt.title('花瓣长度 vs 花瓣宽度(按种类着色)')
plt.xlabel('花瓣长度 (cm)')
plt.ylabel('花瓣宽度 (cm)')
plt.legend()
plt.grid(True)
plt.show()
观察发现:setosa的花瓣尺寸明显小于其他两类,而virginica和versicolor在花瓣尺寸上有部分重叠。
3. 直方图:理解数据分布
3.1 单变量分布直方图
直方图能直观展示单个特征的分布情况:
plt.figure(figsize=(10, 6))
plt.hist(df['sepal length (cm)'], bins=15, color='skyblue', edgecolor='black')
plt.title('花萼长度分布直方图')
plt.xlabel('花萼长度 (cm)')
plt.ylabel('频数')
plt.grid(axis='y', alpha=0.75)
plt.show()
3.2 多子图直方图比较
比较不同种类鸢尾花的花萼长度分布:
fig, ax = plt.subplots(1, 3, figsize=(18, 5))
for i, species in enumerate(df['species'].unique()):
ax[i].hist(df[df['species']==species]['sepal length (cm)'],
bins=12, color=list(colors.values())[i], alpha=0.7)
ax[i].set_title(f'{species}的花萼长度分布')
ax[i].set_xlabel('花萼长度 (cm)')
ax[i].set_ylabel('频数')
ax[i].grid(True)
plt.tight_layout()
plt.show()
专业提示:直方图的bin数量选择会影响分布形态的呈现。一般可以使用以下公式估算最佳bin数:
import numpy as np
bin_count = int(np.sqrt(len(df))) # 平方根法则
4. 箱线图:洞察数据统计特征
4.1 单变量箱线图
箱线图能一目了然地展示数据的五个关键统计量:
plt.figure(figsize=(8, 6))
plt.boxplot(df['petal width (cm)'], vert=False, patch_artist=True)
plt.title('花瓣宽度箱线图')
plt.xlabel('花瓣宽度 (cm)')
plt.yticks([])
plt.grid(axis='x')
plt.show()
4.2 多变量分类箱线图
比较不同种类鸢尾花的花瓣宽度分布:
plt.figure(figsize=(10, 7))
df.boxplot(column='petal width (cm)', by='species', grid=False,
patch_artist=True,
boxprops={'facecolor':'lightblue'},
medianprops={'color':'red'})
plt.title('不同种类鸢尾花的花瓣宽度比较')
plt.suptitle('') # 移除自动生成的标题
plt.xlabel('鸢尾花种类')
plt.ylabel('花瓣宽度 (cm)')
plt.grid(axis='y')
plt.show()
4.3 解读箱线图的关键元素
一个完整的箱线图包含以下信息:
| 元素 | 说明 | 统计意义 |
|---|---|---|
| 上须线 | 箱子上方的线 | Q3 + 1.5×IQR 或最大值(取较小者) |
| 箱子顶部 | 箱子上边界 | 第三四分位数(Q3) |
| 箱中线 | 箱子中间的线 | 中位数(Q2) |
| 箱子底部 | 箱子下边界 | 第一四分位数(Q1) |
| 下须线 | 箱子下方的线 | Q1 - 1.5×IQR 或最小值(取较大者) |
| 离群点 | 须线外的点 | 异常值 |
5. 高级技巧:图表组合与美化
5.1 散点图矩阵
使用seaborn库可以轻松创建散点图矩阵:
import seaborn as sns
sns.set(style='ticks')
sns.pairplot(df, hue='species', palette=colors, height=2.5)
plt.show()
5.2 直方图与密度曲线叠加
plt.figure(figsize=(10, 6))
sns.histplot(data=df, x='sepal length (cm)', hue='species',
element='step', stat='density', common_norm=False)
sns.kdeplot(data=df, x='sepal length (cm)', hue='species',
common_norm=False)
plt.title('花萼长度分布(直方图+KDE)')
plt.xlabel('花萼长度 (cm)')
plt.grid(True)
plt.show()
5.3 图表美化技巧
几个提升图表专业度的实用技巧:
- 字体与尺寸:增大标题和标签字体
plt.rcParams.update({'font.size': 12})
- 颜色方案:使用专业配色
colors = sns.color_palette('husl', 3)
- 图表布局:调整边距防止标签被截断
plt.tight_layout()
- 保存高清图:
plt.savefig('plot.png', dpi=300, bbox_inches='tight')
更多推荐


所有评论(0)