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

如何为Plotly生成的3D曲面添加网格?已尝试Mesh3d无效果

解决Plotly 3D曲面添加网格的问题

你尝试给Plotly的3D曲面添加网格(预期效果为曲面带有清晰的网格线),但通过go.Mesh3d添加后没有变化,核心原因是**Mesh3d的坐标格式要求与Surface不同**,直接传入DataFrame的列和索引无法正确生成网格结构。以下是两种可行的解决方案:


方案1:直接使用Surface组件的contours参数(推荐)

这是Plotly原生支持的添加曲面网格的方法,无需额外添加trace,代码简洁且效果符合预期:

df_interpolated_annual = ma_df.interpolate(method='linear')

fig_annual = go.Figure(data=[go.Surface(
    z=df_interpolated_annual.values,
    x=df_interpolated_annual.columns,
    y=df_interpolated_annual.index,
    colorscale=colorscale,
    # 配置曲面网格线
    contours=dict(
        x=dict(show=True, color='black', width=1),  # X方向网格
        y=dict(show=True, color='black', width=1),  # Y方向网格
        z=dict(show=True, color='black', width=1)   # Z方向网格
    )
)])
fig_annual.update_layout(title='Annual', scene=dict(
    xaxis=dict(title='Variable1', ticktext=df_interpolated_annual.columns.tolist(), tickvals=list(range(len(df_interpolated_annual.columns))), tickfont=dict(size=12)),
    yaxis=dict(title='Date', tickfont=dict(size=12)), 
    zaxis=dict(title='Variable2', tickfont=dict(size=12)), 
    aspectratio=dict(x=1, y=1, z=0.7)
    ),
    width=1000, 
    height=1000
)
fig_annual.show()

说明:

  • contours参数可分别控制x、y、z三个方向的网格线,通过show=True开启显示,还能调整颜色、宽度等样式。
  • 此方法与原生Surface组件深度兼容,不会出现层级遮挡或格式错误问题。

方案2:正确构造Mesh3d的坐标与面索引

如果必须使用Mesh3d,需要先将坐标转换为网格扁平化数组,并手动定义网格面的索引(i/j/k参数):

import numpy as np
df_interpolated_annual = ma_df.interpolate(method='linear')

x = df_interpolated_annual.columns
y = df_interpolated_annual.index
z = df_interpolated_annual.values

# 生成网格坐标并扁平化
x_grid, y_grid = np.meshgrid(x, y)
x_flat = x_grid.flatten()
y_flat = y_grid.flatten()
z_flat = z.flatten()

# 构造Mesh3d需要的三角形面索引
n_x = len(x)
n_y = len(y)
i, j, k = [], [], []
for y_idx in range(n_y - 1):
    for x_idx in range(n_x - 1):
        # 第一个三角形
        i.append(y_idx * n_x + x_idx)
        j.append(y_idx * n_x + x_idx + 1)
        k.append((y_idx + 1) * n_x + x_idx)
        # 第二个三角形
        i.append(y_idx * n_x + x_idx + 1)
        j.append((y_idx + 1) * n_x + x_idx + 1)
        k.append((y_idx + 1) * n_x + x_idx)

fig_annual = go.Figure()
# 添加基础曲面(调整透明度让网格可见)
fig_annual.add_trace(go.Surface(
    z=z,
    x=x,
    y=y,
    colorscale=colorscale,
    opacity=0.8
))
# 添加Mesh3d网格
fig_annual.add_trace(go.Mesh3d(
    x=x_flat,
    y=y_flat,
    z=z_flat,
    i=i,
    j=j,
    k=k,
    color='black',
    opacity=1,
    showlegend=False,
    flatshading=True
))

fig_annual.update_layout(title='Annual', scene=dict(
    xaxis=dict(title='Variable1', ticktext=x.tolist(), tickvals=list(range(len(x))), tickfont=dict(size=12)),
    yaxis=dict(title='Date', tickfont=dict(size=12)), 
    zaxis=dict(title='Variable2', tickfont=dict(size=12)), 
    aspectratio=dict(x=1, y=1, z=0.7)
    ),
    width=1000, 
    height=1000
)
fig_annual.show()

说明:

  • Mesh3d依赖三角形面索引(i/j/k)来构建网格,必须手动生成这些索引才能正确渲染网格线。
  • 需要调整Surface的透明度,避免网格被曲面完全遮挡。

内容的提问来源于stack exchange,提问作者Dennis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:02:45