如何用wireframe surface替代trisurf绘制3D图?trisurf为何部分透明?
问题解答
1. 能否用Wireframe Surface替代热力图曲面?
完全可以,不过需要先把扁平化的数据转换为二维网格格式——因为plot_wireframe要求输入的X、Y是二维网格矩阵,Z是对应的二维数值矩阵,而你当前的代码是把所有点扁平化存储的。
修改后的代码示例
import numpy as np import matplotlib.pyplot as plt def toy_g_2(sig): y_axis = np.linspace(4, 0, 100) x_axis = np.linspace(0, 4, 100) # 直接生成网格矩阵,替代扁平化列表,计算效率更高 X, Y = np.meshgrid(x_axis, y_axis) Z = 1/(np.sqrt(2*np.pi*sig**2)) * np.exp(-(1 - X*Y)**2/(2*sig**2)) # 归一化处理 Z = Z / Z.sum() # 绘制线框曲面 ax = plt.axes(projection='3d') # rstride和cstride控制网格疏密,数值越大线框越稀疏 ax.plot_wireframe(X, Y, Z, color='darkblue', rstride=5, cstride=5) ax.set_zlabel('probability density', fontsize=12, rotation=0) ax.set_ylabel('b', fontsize=12, rotation=0) ax.set_xlabel('a', fontsize=12, rotation=0) plt.show() # 调用示例 toy_g_2(0.5)
如果想要保留颜色映射效果,也可以用plot_surface搭配参数实现带色彩的线框:
ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='black', facecolor='none')
2. plot_trisurf部分区域透明的原因
这是因为matplotlib默认开启了背面剔除(Backface Culling):当三角剖分生成的三角形法向量朝向与相机视角相反时,这些三角形会被自动隐藏,视觉上就呈现出透明区域。
解决方法
- 方法1:在
plot_trisurf中提高剖分精度,同时关闭背面剔除相关设置:ax.plot_trisurf(col1, col2, col3, cmap='viridis', edgecolor='none', rcount=200, ccount=200, shade=False) - 方法2:改用
plot_surface(需要网格数据),它的剖分逻辑更稳定,不会出现这类局部透明问题 - 方法3:通过
ax.view_init(elev=30, azim=45)调整相机视角,让原本被遮挡的面显示出来
内容的提问来源于stack exchange,提问作者Andrew Rubner
相关产品推荐
相关产品推荐

