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')
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐