You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Plotly中z-x平面的垂直3D曲面图无法显示问题排查

问题分析与解决方案

你遇到的核心问题是Plotly Surface 组件的维度匹配规则被忽略了——虽然直接交换x和y参数看起来合理,但这导致了x、y数组的长度与z数组的维度不匹配,Plotly无法正确解析数据,所以曲面静默不显示。

先理解原代码能运行的原因

你的原代码中,z的形状是(100, 50)(把长度为50的z1重复100次):

  • x1是长度为100的全0数组,y1是长度为100的数组
  • 因为x1全为0,即使它的长度(100)和z的列数(50)不匹配,Plotly也能通过广播机制渲染出x=0的平面(所有点的x坐标都是0)

但当你交换x和y后,x=y1(长度100)、y=x1(长度100),z还是(100,50)

  • x的长度(100)和z的列数(50)不匹配,且x不是单一值,Plotly无法正确广播,导致曲面无法渲染,又没有抛出明确错误。

正确的实现方式

要绘制z-x平面(即y=0的平面),需要严格遵循Plotly Surface的维度规则:

  • 如果使用1D数组的x和y:x的长度必须等于z的列数,y的长度必须等于z的行数
  • 更直观的方式是用np.meshgrid生成二维的x、y、z数组,确保维度完全匹配

这里提供两种可行的写法:

写法1:用meshgrid生成匹配的二维数组

import plotly.graph_objects as go
import numpy as np

# 生成x和z的网格,y全为0
x, z = np.meshgrid(np.linspace(-5, 5, 100), np.linspace(-2.5, 2.5, 50))
y = np.zeros_like(x)  # y全为0,和x/z同形状
rc = np.random.rand(*x.shape)  # 颜色数组匹配网格形状

plane = go.Surface(x=x, y=y, z=z, surfacecolor=rc)
figure = go.Figure()
figure.add_traces([plane])
figure.show()

写法2:调整1D数组与z的维度匹配

import plotly.graph_objects as go
import numpy as np

x1 = np.linspace(-5, 5, 100)  # x的取值,长度100(对应z的列数)
y1 = np.zeros(50)  # y全为0,长度50(对应z的行数)
z1 = np.linspace(-2.5, 2.5, 50)
rc = np.random.rand(50, 100)  # 颜色数组形状(50,100),匹配z的形状

# z数组转置,让行数=50(对应y的长度),列数=100(对应x的长度)
plane = go.Surface(x=x1, y=y1, z=np.array([z1] * len(x1)).T, surfacecolor=rc)
figure = go.Figure()
figure.add_traces([plane])
figure.show()

这两种写法都能正确渲染出y=0的z-x平面,核心是保证x、y的维度与z的行列数严格对应。

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

火山引擎 最新活动