刚开始接触机器学习的时候,大多数人第一个上手的项目就是鸢尾花分类。这个数据集在 sklearn 里内置,一行代码就能加载,150 条样本、4 个特征、3 个类别,结构简单但信息量足够丰富,特别适合拿来熟悉数据分析和可视化的基本操作。但有一个问题很常见:数据加载出来了,看到的是一堆数字矩阵,怎么把三类样本在图上区分开?这篇文章我整理了五种我实际用过的方案,从最基础的 matplotlib 手写散点图,到一行代码出完整图的 seaborn pairplot,再到可交互的 3D 图,每套代码都是可以直接复制的,你按需取用就行。
1. 准备工作:先认识鸢尾花数据集
1.1 鸢尾花数据集为什么适合入门
鸢尾花数据集(Iris Dataset)几乎可以说是机器学习界的“Hello World”。它由英国统计学家 Ronald Fisher 在 1936 年引入,包含 3 个鸢尾花品种(setosa、versicolor、virginica)各 50 条样本,每条样本记录 4 个特征:
- sepal length (cm):花萼长度
- sepal width (cm):花萼宽度
- petal length (cm):花瓣长度
- petal width (cm):花瓣宽度
这个数据集的巧妙之处在于:setosa 这个品种和另外两个品种在花瓣特征上区分度极高,而 versicolor 和 virginica 之间有部分重叠,既不是完全线性可分,也不是完全揉成一团。用这个数据集来做可视化练习,你能非常直观地感受到“特征选择”的重要性——选对了特征组合,类别边界一目了然;选错了,三类样本混在一起怎么看都分不开。
另外,sklearn 内置了这个数据集,不需要去网上下载文件,也不需要联网,本地环境装好 sklearn 就能直接用。对于刚入门、还在折腾环境的新手来说,省去了数据获取这一步,可以把精力集中在理解数据和处理流程上。
1.2 用一行代码加载数据集
sklearn 提供了 load_iris() 函数,使用方式非常简单:
python复制from sklearn.datasets import load_iris
iris = load_iris()
print(type(iris))
# <class 'sklearn.utils.Bunch'>
这里返回的是一个 Bunch 对象,你可以把它理解成一个“加强版字典”,里面同时包含了数据、标签、特征名、类别名等多个部分。直接用 dir(iris) 或者 .keys() 就能看到它有哪些字段。
python复制print(iris.keys())
# dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])
我常用的字段有几个:data 是特征矩阵,形状为 (150, 4);target 是类别标签的数值数组,0、1、2 分别对应三个品种;target_names 是类别名的字符串数组;feature_names 是四个特征名称的列表。这几个字段配合使用,基本可以完成大部分数据探索和可视化工作。
1.3 转换成 DataFrame 并确认数据结构
虽然直接用 numpy 数组也能做可视化,但我还是建议先把数据转成 pandas 的 DataFrame,这样查看数据、筛选样本、和 seaborn 等可视化库配合起来都更顺手。
python复制import pandas as pd
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['label'] = iris.target
df['species'] = iris.target_names[iris.target]
print(df.head())
运行这段代码,你会看到前 5 行数据,每一行代表一朵鸢尾花。label 列是数值标签,species 列是具体的品种名称。我通常在 DataFrame 里同时保留这两列:label 用于按数值筛选或作为颜色映射,species 用于图例展示和分组操作,两边都方便。
再确认一下类别分布:
python复制print(df['species'].value_counts())
# setosa 50
# versicolor 50
# virginica 50
三个类别各 50 条,非常均衡,这就不用担心可视化时某一类样本过少导致图形失真了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 方案一:matplotlib 手写散点图,最基础也最可控
2.1 为什么要先看手写方案
现在有很多现成的封装好的画图函数,两三行代码就能出一张漂亮的图。但如果你想真正理解散点图是怎么画出来的、每个点是怎么根据特征值落到坐标轴上的,那还是得亲手写一遍。方案一就是用 matplotlib 的 scatter 函数,通过循环遍历三个类别,分别画三种颜色的点。这个方案看起来啰嗦,但它是所有后续方案的基础,也是排查问题时最好定位的一个方案。
2.2 核心代码实现
python复制import matplotlib.pyplot as plt
colors = ['#FF6B6B', '#4ECDC4', '#45B7D1']
# 选择两个特征进行可视化,这里选的是花萼长度和花瓣长度
x_idx, y_idx = 0, 2
x_label, y_label = iris.feature_names[x_idx], iris.feature_names[y_idx]
plt.figure(figsize=(8, 6))
for i, label in enumerate(iris.target_names):
