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

求助:基于三维坐标的4D热力图插值与归一化实现

解决方案:3D圆柱温度热力图(带归一化与插值)

问题分析

你的代码存在两个核心问题:

  • 颜色归一化错误:未使用所有温度数据的全局极值统一映射,且代码中存在变量名错误(如grid应为grad,fBcolors/fCcolors未定义)
  • 无插值效果:仅绘制离散点,未在三维空间生成连续的温度渐变场

步骤1:修复颜色统一归一化

  1. 合并所有温度数据集,计算全局最小/最大值
  2. 基于全局极值创建Normalize对象,确保所有点的颜色映射统一
  3. 修正代码中的变量名与语法错误

步骤2:实现三维插值(极坐标适配)

因为是圆柱场景,优先将笛卡尔坐标转换为极坐标(r, θ, z),在极坐标网格上进行插值后再转回笛卡尔坐标,适配圆柱对称的场景:

  • 使用scipy.interpolate.griddata实现三维插值
  • 生成高密度的圆柱网格,将离散温度值插值到网格上

完整修正代码

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from scipy.interpolate import griddata

### 1. 温度数据与坐标整理 ###
# 合并所有温度数据,用于全局归一化
temp_data = np.concatenate([
    [1,2,3,2,1],  # 中心轴点
    [2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,3,3,3,3,3,3,2,2,2,2,2,2],  # 内圆柱
    [3,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5,4,4,4,4,4,4,3,3,3,3,3,3],  # 中圆柱
    [4,4,4,4,4,4,5,5,5,5,5,5,6,6,6,6,6,6,5,5,5,5,5,5,4,4,4,4,4,4]   # 外圆柱
])

# 生成所有离散点的坐标
a, b = 0, 0
r_list = [0, 2.5, 5, 7.5]  # 中心、内、中、外半径
heights = np.array([1,2,3,4,5])
theta = np.linspace(0, 2*np.pi, 7)[:-1]  # 6个径向点

# 收集所有离散点的(X,Y,Z,T)
all_points = []
for r in r_list:
    if r == 0:
        # 中心轴只有一个点/高度
        for z in heights:
            t = temp_data[heights.tolist().index(z)]
            all_points.append([0, 0, z, t])
    else:
        # 圆柱上的点:每个高度对应6个角度点
        temp_slice = temp_data[len(heights) + (r_list.index(r)-1)*30 : len(heights) + (r_list.index(r))*30]
        for idx_z, z in enumerate(heights):
            for th in theta:
                x = a + r*np.cos(th)
                y = b + r*np.sin(th)
                t = temp_slice[idx_z*6 : (idx_z+1)*6][theta.tolist().index(th)]
                all_points.append([x, y, z, t])

all_points = np.array(all_points)
X, Y, Z, T = all_points[:,0], all_points[:,1], all_points[:,2], all_points[:,3]

### 2. 全局颜色归一化 ###
cmap = 'coolwarm'
norm = mpl.colors.Normalize(vmin=np.min(temp_data), vmax=np.max(temp_data))
sm = mpl.cm.ScalarMappable(norm=norm, cmap=cmap)
sm.set_array([])  # 仅用于颜色条

### 3. 三维插值生成连续热力场 ###
# 生成圆柱网格(极坐标转笛卡尔)
grid_r = np.linspace(0, 7.5, 50)
grid_theta = np.linspace(0, 2*np.pi, 100)
grid_z = np.linspace(1, 5, 50)

# 网格转笛卡尔坐标
R, Theta, Z_grid = np.meshgrid(grid_r, grid_theta, grid_z)
X_grid = R * np.cos(Theta)
Y_grid = R * np.sin(Theta)

# 将离散点转换为极坐标用于插值
r_points = np.sqrt(X**2 + Y**2)
theta_points = np.arctan2(Y, X)
# 处理theta=0和2pi的连续性
theta_points[theta_points < 0] += 2*np.pi

# 插值温度到网格上
T_grid = griddata(
    points=(r_points, theta_points, Z),
    values=T,
    xi=(R, Theta, Z_grid),
    method='cubic'  # 立方插值,平滑效果好
)

### 4. 可视化绘制 ###
fig = plt.figure(figsize=(15,15), dpi=300)
ax = fig.add_subplot(111, projection='3d')

# 绘制插值后的圆柱曲面(分层或整体)
# 这里绘制多个高度层的曲面,展示温度渐变
for z_idx in range(0, len(grid_z), 5):
    z_val = grid_z[z_idx]
    ax.plot_surface(
        X_grid[:,:,z_idx], Y_grid[:,:,z_idx], np.full_like(X_grid[:,:,z_idx], z_val),
        facecolors=cmap(norm(T_grid[:,:,z_idx])),
        alpha=0.7, edgecolor='none'
    )

# 绘制原始离散点(可选,用于对比)
ax.scatter(X, Y, Z, c=T, norm=norm, cmap=cmap, marker='o', s=100, edgecolors='black', zorder=10)

# 添加颜色条
fig.colorbar(sm, ax=ax, orientation='vertical', label='Temperature')

# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z (Height)')
ax.set_title('3D Cylinder Temperature Heatmap (Interpolated)')

plt.show()

关键改进说明

  • 统一归一化:用np.min(temp_data)和np.max(temp_data)创建全局归一化对象,所有颜色映射基于同一标尺
  • 极坐标插值:适配圆柱对称场景,避免笛卡尔坐标插值的边界问题,cubic插值生成平滑的渐变效果
  • 语法修复:修正原代码中CoordsO未定义、变量名错误、括号缺失等问题

替代可视化方案

如果需要更交互性的3D热力图,可以使用Plotly:

  • 支持鼠标旋转、缩放,方便查看内部温度分布
  • 内置的Volume或Surface组件可直接实现三维插值可视化

示例核心代码片段:

import plotly.graph_objects as go

fig = go.Figure(data=go.Volume(
    x=X_grid.flatten(), y=Y_grid.flatten(), z=Z_grid.flatten(),
    value=T_grid.flatten(),
    isomin=np.min(temp_data), isomax=np.max(temp_data),
    opacity=0.3,  # 透明度调整
    surface_count=20,  # 生成的曲面数量
    colorscale='coolwarm'
))
fig.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:55:54