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

如何基于独立XYZ点生成3D曲面并按C值着色?

基于散点XYZ生成3D曲面并按自定义C值着色

问题背景

拥有一组4D散点数据(X、Y、Z坐标点+对应的C数值),需要基于X、Y、Z生成3D曲面,同时以C值作为曲面的着色依据。现有两种实现均无法满足需求:

  • 方案1:使用plot_trisurf生成曲面,但仅能基于Z值着色,无法替换为C值
  • 方案2:实现了按自定义值着色,但要求Z是X、Y的网格函数,不适用于散点数据场景

修改方案(基于方案1的代码改造)

核心思路是:将C值通过颜色映射转换为RGBA颜色数组,然后传递给plot_trisurf的facecolors参数,替代默认的Z值着色逻辑。

修改后的完整代码

import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
from matplotlib import cm
from matplotlib.colors import Normalize
import numpy as np

# ======
## 数据:新增C值列(实际使用时替换为你的C数据即可)
DATA = np.array([
    [-0.807237702464, 0.904373229492, 111.428744443, 120],
    [-0.802470821517, 0.832159465335, 98.572957317, 105],
    [-0.801052795982, 0.744231916692, 86.485869328, 92],
    [-0.802505546206, 0.642324228721, 75.279804677, 80],
    [-0.804158144115, 0.52882485495, 65.112895758, 70],
    [-0.806418040943, 0.405733109371, 56.1627277595, 61],
    [-0.808515314192, 0.275100227689, 48.508994388, 53],
    [-0.809879521648, 0.139140394575, 42.1027499025, 46],
    [-0.810645106092, -7.48279012695e-06, 36.8668106345, 40],
    [-0.810676720161, -0.139773175337, 32.714580273, 35],
    [-0.811308686707, -0.277276065449, 29.5977405865, 31],
    [-0.812331692291, -0.40975978382, 27.6210856615, 29],
    [-0.816075037319, -0.535615685086, 27.2420699235, 28],
    [-0.823691366944, -0.654350489595, 29.1823292975, 30],
    [-0.836688691603, -0.765630198427, 34.2275056775, 35],
    [-0.854984518665, -0.86845932028, 43.029581434, 45],
    [-0.879261949054, -0.961799684483, 55.9594146815, 58],
    [-0.740499820944, 0.901631050387, 97.0261463995, 102],
    [-0.735011699497, 0.82881933383, 84.971061395, 89],
    [-0.733021568161, 0.740454485354, 73.733621269, 78],
    [-0.732821755233, 0.638770044767, 63.3815970475, 67],
    [-0.733876941678, 0.525818698874, 54.0655910105, 57],
    [-0.735055978521, 0.403303715698, 45.90859502, 48],
    [-0.736448900325, 0.273425879041, 38.935709456, 41],
    [-0.737556181137, 0.13826504904, 33.096106049, 35],
    [-0.738278724065, -9.73058423274e-06, 28.359664343, 30],
    [-0.738507612286, -0.138781586244, 24.627237837, 26],
    [-0.738539663773, -0.275090412979, 21.857410904, 23],
    [-0.739099040189, -0.406068448513, 20.1110519655, 21],
    [-0.741152200369, -0.529726022182, 19.7019157715, 20],
])

Xs = DATA[:,0]
Ys = DATA[:,1]
Zs = DATA[:,2]
Cs = DATA[:,3]  # 自定义着色的C值

# ======
## 绘图:

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 1. 初始化颜色归一化和映射器,将C值映射到指定色板
norm = Normalize(vmin=Cs.min(), vmax=Cs.max())
cmap = cm.get_cmap("hot")
sm = cm.ScalarMappable(norm=norm, cmap=cmap)
sm.set_array([])  # 仅用于颜色条生成,无需传入数据

# 2. 将C值转换为对应的RGBA颜色数组
face_colors = cmap(norm(Cs))

# 3. 绘制三角曲面,使用C值对应的颜色,不指定cmap参数
surf = ax.plot_trisurf(Xs, Ys, Zs, facecolors=face_colors, linewidth=0)

# 4. 添加颜色条,关联到C值的映射
fig.colorbar(sm, label="C值")

ax.xaxis.set_major_locator(MaxNLocator(5))
ax.yaxis.set_major_locator(MaxNLocator(6))
ax.zaxis.set_major_locator(MaxNLocator(5))

fig.tight_layout()

plt.show()

关键修改点说明

  1. 颜色映射处理:使用Normalize将C值归一化到[0,1]区间,再通过指定色板(如hot)转换为RGBA颜色数组
  2. 替换着色逻辑:调用plot_trisurf时,不再使用cmap参数,而是通过facecolors传入转换后的颜色数组,直接指定每个三角面片的颜色
  3. 颜色条关联:手动创建ScalarMappable对象并关联颜色条,确保颜色条的刻度与C值对应

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 13:32:03