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

使用Plotly的create_trisurf绘制常量曲面报错的解决咨询

Plotly常量曲面绘制错误修复及Delaunay代码解析

问题描述

使用Plotly的ff.create_trisurf绘制z值非恒定的曲面时一切正常,但将DataFrame的z列设为常量(比如取消注释c.z=1)后,会抛出以下错误:

PlotlyError: Incorrect relation between vmin and vmax. The vmin value cannot be bigger than or equal to the value of vmax.

同时需要理解代码中Delaunay相关部分的作用。

原代码如下:

import plotly.figure_factory as ff
from scipy.spatial import Delaunay
import pandas as pd
import numpy as np

c = pd.DataFrame(data = np.random.uniform(0,1, (100,3)), columns = ['x', 'y', 'z'])
# c.z=1
points2D = np.vstack([c.x,c.y]).T
tri = Delaunay(points2D)
simplices = tri.simplices


fig = ff.create_trisurf(x=c.x, y=c.y, z=c.z,
                         simplices=simplices, 
                          aspectratio=dict(x=1, y=1, z=0.3))
fig.show()

解决方案

修复常量z曲面的报错

报错核心原因是:当z值全为常量时,Plotly自动计算的颜色映射上下界(vmin和vmax)完全相等,而颜色映射逻辑要求vmin必须小于vmax。有两种简单修复方式:

方式1:手动设置带微小差异的vmin和vmax

手动指定略小的vmin和略大的vmax,让颜色映射逻辑正常运行:

import plotly.figure_factory as ff
from scipy.spatial import Delaunay
import pandas as pd
import numpy as np

c = pd.DataFrame(data = np.random.uniform(0,1, (100,3)), columns = ['x', 'y', 'z'])
c.z = 1  # 设置常量z
points2D = np.vstack([c.x,c.y]).T
tri = Delaunay(points2D)
simplices = tri.simplices

fig = ff.create_trisurf(x=c.x, y=c.y, z=c.z,
                        simplices=simplices, 
                        aspectratio=dict(x=1, y=1, z=0.3),
                        vmin=0.99, vmax=1.01)  # 手动设置上下界
fig.show()

方式2:指定单一颜色,跳过颜色映射计算

直接给曲面设置固定颜色,避免Plotly自动计算颜色映射的上下界:

import plotly.figure_factory as ff
from scipy.spatial import Delaunay
import pandas as pd
import numpy as np

c = pd.DataFrame(data = np.random.uniform(0,1, (100,3)), columns = ['x', 'y', 'z'])
c.z = 1
points2D = np.vstack([c.x,c.y]).T
tri = Delaunay(points2D)
simplices = tri.simplices

fig = ff.create_trisurf(x=c.x, y=c.y, z=c.z,
                        simplices=simplices, 
                        aspectratio=dict(x=1, y=1, z=0.3),
                        color='lightblue')  # 指定单一颜色
fig.show()

Delaunay代码部分的含义

这部分代码是为了给散点生成三角网格,让Plotly能把离散的(x,y,z)点连接成连续曲面:

  • points2D = np.vstack([c.x,c.y]).T:把DataFrame中的x、y列合并成一个N×2的二维数组,每个元素对应一个平面上的(x,y)点——因为Delaunay三角剖分只处理二维点集。
  • tri = Delaunay(points2D):用Scipy的Delaunay函数对平面散点做三角剖分,简单来说就是用不重叠的三角形把所有散点连接起来,覆盖点集的整个凸包区域。
  • simplices = tri.simplices:获取三角剖分的结果,这是一个M×3的数组,每一行的三个数字代表构成一个三角形的三个点在points2D数组中的索引。create_trisurf需要这个参数来知道如何把散点拼接成曲面网格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:47:25