使用Matplotlib与ListedColormap绘制鸢尾花数据集:散点图颜色异常求助
解决鸢尾花数据集散点图按标签分色的问题
嘿,我一眼就看出问题啦!你已经把鸢尾花数据整理得很到位,但散点图没按标签分色的原因是**plt.scatter()缺少了关键的颜色映射依据参数**。咱们来快速修正:
问题根源
你只设置了cmap=cmap_bold,但没有告诉Matplotlib「根据哪个字段来分配颜色」——也就是缺失了c参数,这个参数需要传入你的标签列,让不同的标签值对应到你定义的颜色映射里。
修正后的完整代码
import numpy as np import pandas as pd from sklearn.datasets import load_iris import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap # 加载并整理数据 iris = load_iris() data = pd.DataFrame(iris.data, columns=iris.feature_names) data['label'] = iris.target # 定义三类鸢尾花对应的颜色 cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF']) # 绘制散点图:关键是添加c=data['label']参数 plt.scatter( data['sepal length (cm)'], data['sepal width (cm)'], c=data['label'], # 核心:根据标签列分配颜色 cmap=cmap_bold, edgecolor='white' # 可选:给点加白色边框,让不同颜色点更清晰 ) # 优化图表标注 plt.title("Sepal Width vs Sepal Length (By Iris Species)") plt.xlabel('Sepal Length (cm)') plt.ylabel('Sepal Width (cm)') # 添加图例(因为scatter默认不会自动生成分类图例,手动创建) from matplotlib.patches import Patch legend_elements = [ Patch(color='#FF0000', label='Setosa'), Patch(color='#00FF00', label='Versicolor'), Patch(color='#0000FF', label='Virginica') ] plt.legend(handles=legend_elements, loc='upper right') plt.show()
关键说明
c=data['label']:这是核心!把标签列(值为0、1、2)传入,Matplotlib会自动将每个标签值对应到cmap_bold里的颜色(0→红色,1→绿色,2→蓝色)- 新增的
edgecolor='white'是可选优化,能让密集的点边界更清晰,避免颜色混在一起 - 手动添加图例是因为散点图的默认图例是基于颜色数值的,咱们需要把标签值映射成对应的鸢尾花品种名称,让图表更易读
这样修改后,你就能看到三类鸢尾花的散点分别显示红、绿、蓝三种颜色啦!
内容的提问来源于stack exchange,提问作者Amanda Wang
相关产品推荐
相关产品推荐

