如何使用Pandas DataFrame三列特征绘制平滑3D曲面图
锯齿问题产生的原因
- 样本量不足:当前只有30组离散样本,
plot_trisurf函数会直接基于原始离散点构建三角网格拼接曲面,稀疏的样本点会导致拼接的三角面边界清晰可见,最终呈现锯齿效果 - 无插值处理:直接使用原始散点绘图,没有对数据做插值扩充生成更高密度的平滑网格,曲面自然没有过渡效果
- 抗锯齿未开启:默认绘图参数下未开启抗锯齿配置,也会放大边缘的锯齿感
平滑曲面的调整方案
你可以先通过插值算法把不规则的离散散点转换为高密度的规则网格数据,再配合绘图参数优化实现平滑效果,需要用到scipy.interpolate.griddata做插值处理,完整代码如下:
from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt from matplotlib import cm import numpy as np from scipy.interpolate import griddata import pandas as pd # 读取数据(这里替换为你自己的df读取逻辑) # df = pd.read_csv(你的数据路径) x = df['age'].values y = df['size_tc'].values z = df['Survival_days'].values # 生成规则网格,分辨率可以自己调整,数值越大曲面越平滑,计算量也越高 xi = np.linspace(x.min(), x.max(), 100) yi = np.linspace(y.min(), y.max(), 100) Xi, Yi = np.meshgrid(xi, yi) # 三次插值生成平滑的Z轴数据,可选插值方法:'nearest'/'linear'/'cubic',cubic平滑度最高 Zi = griddata((x, y), z, (Xi, Yi), method='cubic') # 绘图 fig = plt.figure(figsize=(10,8)) ax = fig.add_subplot(111, projection='3d') # 绘制曲面,开启抗锯齿、隐藏网格边 surf = ax.plot_surface(Xi, Yi, Zi, cmap=cm.coolwarm, linewidth=0, antialiased=True, edgecolor='none') # 可选:添加坐标轴标签和色条 ax.set_xlabel('age') ax.set_ylabel('size_tc') ax.set_zlabel('Survival_days') fig.colorbar(surf, shrink=0.5, aspect=5) plt.show()
参数说明
- 网格分辨率:
linspace里的100可以调整,数值越高网格点越密,曲面越平滑,对应计算耗时也会增加 - 插值方法:如果cubic插值结果有异常值,可以换成
linear线性插值,稳定性更高;如果出现边缘空白区域,可添加fill_value参数填充默认值 - 绘图参数:
antialiased=True开启抗锯齿,edgecolor='none'隐藏网格边框,都可以进一步降低锯齿感
内容的提问来源于stack exchange,提问作者Dushi Fdz
相关产品推荐
相关产品推荐

