如何绘制与3D散点图范围匹配的过中心平面?
解决3D散点图中平面与散点范围不匹配的问题
我来帮你搞定这个问题!你的平面之所以把散点挤到一侧,核心问题是生成平面时的x、y轴范围没有和散点的实际数据范围对齐,而且linspace的参数使用有误。咱们一步步修正:
问题分析
- 你用
df['fixed acidity'].shape作为linspace的上下限,这是错误的——shape返回的是数据的维度(比如(1599,)),不是数值范围,导致平面的x、y轴范围完全偏离散点的实际分布。 - 平面的x、y范围没有覆盖散点的
index和fixed acidity的全部取值区间,自然会和散点图大小不匹配。
修正后的代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D df = pd.read_csv('wr.csv') df = df.sample(frac=1) # 获取散点各轴的实际范围,用于生成平面的x、y网格 x_min, x_max = df.index.min(), df.index.max() y_min, y_max = df['fixed acidity'].min(), df['fixed acidity'].max() # 计算z轴的均值(保持你原本的平面逻辑) z_plane = np.mean(np.square(df['fixed acidity'])) # 生成覆盖散点x、y范围的网格,num控制网格密度,可按需调整 X = np.linspace(x_min, x_max, num=50) Y = np.linspace(y_min, y_max, num=50) x, y = np.meshgrid(X, Y) # 生成和x网格同形状的z值矩阵,确保平面平整 z = np.full_like(x, z_plane) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 绘制散点 ax.scatter(df.index, df['fixed acidity'], np.square(df['fixed acidity']), s=5, color='black') # 绘制中心点 ax.scatter(np.mean(df.index), np.mean(df['fixed acidity']), z_plane, color='orange', s=300) # 绘制匹配范围的平面 ax.plot_surface(x, y, z, alpha=0.5) # 可选:添加轴标签,提升图表可读性 ax.set_xlabel('Index') ax.set_ylabel('Fixed Acidity') ax.set_zlabel('Square of Fixed Acidity') plt.show()
关键修正点
- 用散点的
index和fixed acidity的实际最小/最大值定义平面的x、y范围,确保平面完全覆盖散点的分布区域。 - 用
np.full_like(x, z_plane)生成和x网格同形状的z值矩阵,替代原来的x*0+y*0+...,逻辑更清晰且不易出错。 - 可选添加轴标签,让图表信息更直观。
这样修改后,平面就会和散点图的大小完美匹配,不会再出现散点被挤到一侧的情况啦!
内容的提问来源于stack exchange,提问作者ihatecoding
相关产品推荐
相关产品推荐

