You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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()

关键修改点解释

  1. 给散点图加label:在ax.scatter()里加入label=name,这里的name就是每个类别的名称,会直接显示在图例里。
  2. 调用图例函数:用ax.legend()生成图例,locbbox_to_anchor参数可以调整图例的位置(比如放到图表右侧,避免挡住数据点)。
  3. 自定义样式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

火山引擎 最新活动