如何在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
相关产品推荐
相关产品推荐

