如何用Matplotlib为分类数据点添加对应颜色的图例?
解决PCA降维散点图的类别图例问题
嘿,作为Python绘图新手完全懂这种花了好久还是卡壳的感觉!我来帮你搞定这个图例显示的问题~
你现在的问题核心是:直接用plt.scatter的c参数指定类别时,Matplotlib没法自动识别每个颜色对应的类别标签,所以图例没法正常显示。这是因为c参数只是把类别数值映射成颜色,但没有明确告诉绘图工具“每个数值对应一个独立类别”。
给你两种新手友好的解决方案:
方法一:Matplotlib原生循环绘制(最直观)
手动为每个类别单独绘制散点,让每个类别对应一个图例条目,逻辑清晰好理解:
import matplotlib.pyplot as plt # 定义你的类别列表(根据你的数据是[0,1,2]) categories = [0, 1, 2] # 可选:自定义每个类别的颜色,也可以让Matplotlib自动分配 category_colors = ['#FF6B6B', '#4ECDC4', '#45B7D1'] plt.figure(figsize=(15,8)) # 循环每个类别,筛选对应数据并绘制 for cat, color in zip(categories, category_colors): # 筛选出当前类别的所有数据点 category_points = reduced_dataset[y.Gender == cat] # 绘制散点时指定label,这是图例显示的关键! plt.scatter(category_points[:, 0], category_points[:, 1], color=color, label=f'类别 {cat}') plt.xlabel('PC 1') plt.ylabel('PC 2') # 给图例加个标题,更清晰 plt.legend(title='类别标签') # 别忘了加这句!你原来的代码没写,可能也会导致图无法正常显示 plt.show()
方法二:用Seaborn简化代码(更省心)
如果愿意用Seaborn库,一行代码就能自动识别类别并生成图例,省去循环的麻烦:
先确保安装Seaborn:pip install seaborn
然后运行以下代码:
import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize=(15,8)) # 使用scatterplot,hue参数直接指定类别列,自动生成图例 sns.scatterplot(x=reduced_dataset[:,0], y=reduced_dataset[:,1], hue=y.Gender, palette='Set2') plt.xlabel('PC 1') plt.ylabel('PC 2') plt.legend(title='类别标签') plt.show()
另外提醒下:你原来代码最后有个plt.figure(),这会创建一个空的新图,建议删掉换成plt.show(),才能正常显示你画的PCA散点图。
内容的提问来源于stack exchange,提问作者m_fer23




