如何在Matplotlib的3D PCA绘图中添加图例?
给3D PCA散点图添加图例的解决方案
嘿,我明白你遇到的问题了——sklearn的PCA示例代码没提图例怎么加,直接套matplotlib的指南又摸不着头绪对吧?别担心,我给你一步步讲清楚怎么改代码,轻松加上清晰的图例。
核心思路
原示例代码是循环遍历每个类别画散点,但没给每个散点组指定标签(label),所以matplotlib不知道该怎么生成图例。我们只需要在绘制每个类别的散点时添加label参数,最后调用图例函数就行。
修改后的完整代码示例
假设你的自有数据结构和鸢尾花数据集类似:X是特征矩阵,y是类别标签(0/1/2...),target_names是每个标签对应的类别名称(比如["类别A", "类别B", "类别C"])。以下是修改后的代码:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from sklearn.decomposition import PCA # 替换成你的自有数据 X = ... # 特征矩阵,形状(n_samples, n_features) y = ... # 类别标签,形状(n_samples,) target_names = ["类别A", "类别B", "类别C"] # 对应每个标签的名称 # 执行PCA降维到3维 pca = PCA(n_components=3) X_r = pca.fit_transform(X) # 设置颜色(可以自定义) colors = ['navy', 'turquoise', 'darkorange'] # 创建3D绘图对象 fig = plt.figure(1, figsize=(8, 6)) ax = Axes3D(fig, elev=-150, azim=110) # 循环绘制每个类别,关键:添加label参数 for i, (name, color) in enumerate(zip(target_names, colors)): ax.scatter(X_r[y == i, 0], X_r[y == i, 1], X_r[y == i, 2], color=color, edgecolor='k', s=40, label=name) # 添加图例,可调整位置避免遮挡图表 ax.legend(loc='upper left', bbox_to_anchor=(1.05, 1), shadow=True) # 添加标题和轴标签 ax.set_title("3D PCA可视化自有数据") ax.set_xlabel("主成分1") ax.set_ylabel("主成分2") ax.set_zlabel("主成分3") plt.show()
关键修改点解释
- 给散点图加label:在
ax.scatter()里加入label=name,这里的name就是每个类别的名称,会直接显示在图例里。 - 调用图例函数:用
ax.legend()生成图例,loc和bbox_to_anchor参数可以调整图例的位置(比如放到图表右侧,避免挡住数据点)。 - 自定义样式:
s=40调整点的大小,shadow=True给图例加阴影,让它更清晰。
特殊情况处理
如果你的y不是连续的数字标签(比如是字符串或不规则编号),可以先把标签映射成索引:
# 把字符串标签转换成索引 unique_labels = np.unique(y) label_to_idx = {label: i for i, label in enumerate(unique_labels)} y_idx = [label_to_idx[label] for label in y] target_names = unique_labels # 直接用原标签名称作为图例文字
然后把循环里的y == i改成y_idx == i就行。
这样修改后,你的3D PCA图就能清晰显示每个类别的图例啦!
内容的提问来源于stack exchange,提问作者con




