我想使用 GLVolumeItem (带有 x、y 和 z 轴)在 Pyqtgraph 中显示 3D 矩阵,并具有与输入数据相对应的特定颜色。
我该如何继续使用我的代码?
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,:,:] = 10
d2 = np.empty(data.shape + (4,), dtype=np.ubyte)
v = gl.GLVolumeItem(d2)
w.addItem(v)
ax = gl.GLAxisItem()
w.addItem(ax)
if __name__ == '__main__':
pg.exec()
目标是获得与数据级别相对应的不同颜色的 3D 表示。
我想你正在寻找这样的东西:
import numpy as np
import pyqtgraph as pg
import pyqtgraph.opengl as gl
from pyqtgraph import functions as fn
from pyqtgraph.opengl import GLScatterPlotItem
app = pg.mkQApp("GLVolumeItem Example")
w = gl.GLViewWidget()
w.show()
w.setWindowTitle('pyqtgraph example: GLVolumeItem')
w.setCameraPosition(distance=40)
g = gl.GLGridItem()
# g.scale(10, 10, 1)
w.addItem(g)
N_x = 10
N_y = 10
N_z = 10
x = np.arange(N_x)
y = np.arange(N_y)
z = np.arange(N_z)
data = np.zeros((N_x, N_y, N_z))
data[1, :, :] = 10
data[3, :, :] = 10
d2 = np.zeros(data.shape + (4,), dtype=np.ubyte)
print(data.shape)
print(d2.shape)
d2[:, :, :, 0] = 255*data/np.max(data) # only works if minimum is 0
d2[:, :, :, 1] = 0
d2[:, :, :, 2] = 0
d2[:, :, :, 3] = 50
v = gl.GLVolumeItem(d2)
# v.translate(10, 10, 10)
w.addItem(v)
ax = gl.GLAxisItem()
w.addItem(ax)
curve = GLScatterPlotItem()
w.addItem(curve)
# pos = np.array((10, 10, 10)).T
# curve.setData(pos=pos, pxMode=False, color=(255, 255, 255, 100), size=0.2) # I use these for checking positions
if __name__ == '__main__':
pg.exec()
数据具有形状
(N_x, N_y, N_z)
,但体积项的数据应为形状 (N_x, N_y, N_z, 4)
,其中 4
代表颜色。线 d2[:, :, :, 3] = 50
将每个位置的不透明度设置为 50
。 d2[:, :, :, 0] = 255*data/np.max(data)
行根据数组的数据设置颜色的红色部分。