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

如何在PyQtGraph中用GLVolumeItem显示带颜色的3D矩阵?

修改方案:让GLVolumeItem显示数据对应的彩色3D效果

要实现数据层级对应彩色可视化,核心是把3D矩阵的数值映射为RGBA颜色数组,再传入GLVolumeItem。以下是修改后的完整代码及关键说明:

修改后的代码

import numpy as np

import pyqtgraph as pg
import pyqtgraph.opengl as gl
from pyqtgraph import functions as fn

app = pg.mkQApp("GLVolumeItem Example")
w = gl.GLViewWidget()
w.show()
w.setWindowTitle('pyqtgraph example: GLVolumeItem')
w.setCameraPosition(distance=200)

g = gl.GLGridItem()
g.scale(10, 10, 1)
w.addItem(g)

x = np.linspace(0,10,11)
y = np.linspace(0,10,11)
z = np.linspace(0,10,11)

# 构造不同层级的示例数据,数值对应不同颜色
data = np.zeros((10,10,10))
data[1,:,:] = 10
data[3,:,:] = 20
data[5,:,:] = 30
data[7,:,:] = 40

# 1. 选择颜色映射(可替换为plasma、inferno等内置渐变,或自定义)
cmap = pg.colormap.get('viridis')

# 2. 归一化数据到0-1区间,适配颜色映射范围
data_min, data_max = data.min(), data.max()
norm_data = (data - data_min) / (data_max - data_min) if data_max != data_min else np.zeros_like(data)

# 3. 将归一化数据转换为RGBA格式的ubyte数组(GLVolumeItem要求的输入格式)
rgba_img = cmap.map(norm_data, mode='qcolor').convertToFormat(pg.Qt.QtGui.QImage.Format_RGBA8888)
d2 = np.array(rgba_img.constBits()).reshape(data.shape + (4,)).astype(np.ubyte)

# 4. 创建VolumeItem并添加到视图
v = gl.GLVolumeItem(d2)
# 可选:调整透明度,比如让数值高的区域更不透明
# d2[..., 3] = (norm_data * 255).astype(np.ubyte)
w.addItem(v)

# 调整坐标轴大小,增强可读性
ax = gl.GLAxisItem()
ax.setSize(15, 15, 15)
w.addItem(ax)

if __name__ == '__main__':
    pg.exec()

关键修改说明

  • 数据分层:给data的不同Z轴层级设置不同数值,确保颜色映射有区分度
  • 颜色映射:使用pyqtgraph内置的颜色渐变,也可以通过pg.GradientEditorItem自定义渐变方案
  • 格式转换:必须将数据转换为**(width, height, depth, 4)** 形状的RGBA ubyte数组,这是GLVolumeItem的标准输入格式
  • 坐标轴优化:调整GLAxisItem的尺寸,让XYZ轴显示更清晰
  • 透明度控制:可通过修改RGBA数组的第4个通道(alpha),实现不同数据值的透明度差异

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:42:48