You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:55:21