如何在px.scatter_3d中绘制3D PCA类间分离平面
Plotly 3D PCA散点图添加类间分离平面实现方案
不需要修改你已经完成的PCA计算、散点图基础配置代码,直接在原有代码后追加平面绘制逻辑即可,所有库调用、PCA参数、散点图样式、数据结构完全保留原有设定。
实现逻辑
- 基于二分类特征训练线性SVM,得到两类样本的最优线性分隔超平面
- 在PCA降维后的3维坐标空间生成覆盖散点范围的平面网格
- 将平面作为独立Surface图层追加到
px.scatter_3d生成的Figure对象中,不影响原有散点的所有配置
可直接衔接的代码
代码中分隔线以上为你已经编写完成的逻辑,无需做任何改动,分隔线以下为需要追加的分离平面绘制代码:
import numpy as np import pandas as pd from sklearn.decomposition import PCA from sklearn.svm import LinearSVC import plotly.express as px import plotly.graph_objects as go # --- 以下是你已完成的代码,无需修改 --- # PCA计算逻辑(保留你原有参数配置) pca = PCA(n_components=3) # 假设最终输出的3维PCA结果存在df_pca中,列结构为['PC1', 'PC2', 'PC3', 'label'],label为二分类标签 # 原有3D散点图配置(保留你所有自定义的颜色、大小、透明度等样式参数) fig = px.scatter_3d( df_pca, x='PC1', y='PC2', z='PC3', color='label' ) # --- 以上是你已完成的代码,无需修改 --- # ========== 追加以下分离平面绘制代码 ========== # 训练线性分类器获取最优分隔超平面参数 X = df_pca[['PC1', 'PC2', 'PC3']].values y = df_pca['label'].values clf = LinearSVC(dual='auto', max_iter=10000).fit(X, y) # 生成覆盖散点范围的平面网格 x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx, yy = np.meshgrid( np.linspace(x_min, x_max, 50), np.linspace(y_min, y_max, 50) ) # 根据超平面公式w0*x + w1*y + w2*z + b = 0计算z轴坐标 w = clf.coef_[0] b = clf.intercept_[0] zz = (-w[0] * xx - w[1] * yy - b) / w[2] # 将平面图层追加到原有散点图 fig.add_trace( go.Surface( x=xx, y=yy, z=zz, showscale=False, # 隐藏平面自带色条,避免和散点图例冲突 opacity=0.3, # 平面透明度,避免遮挡散点 colorscale=[[0, '#e5e5e5'], [1, '#e5e5e5']], # 平面默认设为浅灰色 name='类间分离平面', hoverinfo='skip' # 关闭平面悬浮提示,不干扰散点交互 ) ) # 保留你原有的图表展示逻辑 fig.show()
参数调整参考
- 平面透明度:修改
go.Surface中的opacity参数,推荐取值0.2-0.4,平衡平面可见性和散点可读性 - 平面颜色:替换
colorscale中的十六进制色值即可自定义平面颜色 - 平面覆盖范围:调整
x_min/x_max、y_min/y_max计算时的偏移量(当前为±1),即可放大/缩小平面的展示范围 - 自定义平面位置:如果不需要SVM计算的最优分隔面,可以跳过模型训练步骤,直接根据你需要的平面公式计算
zz值即可
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

