如何修改PyQtGraph中GLBarGraphItem的默认颜色
解决GLBarGraphItem设置颜色的问题
你说得对,GLBarGraphItem确实没有内置的setColor()方法,不过我们有几种可靠的方式来设置或修改它的颜色,甚至实现堆叠3D柱状图的多色效果:
方法1:初始化时直接指定颜色
创建GLBarGraphItem的时候,可以直接通过color参数传入颜色值,支持单个颜色(适用于所有柱状图)或者每个柱子单独的颜色:
from pyqtgraph.Qt import QtCore, QtGui import pyqtgraph.opengl as gl import numpy as np app = QtGui.QApplication([]) w = gl.GLViewWidget() w.opts['distance'] = 100 w.showMaximized() w.setWindowTitle('pyqtgraph example: GLBarGraphItem Color') ax = gl.GLAxisItem() ax.setSize(20,20,20) w.addItem(ax) pos = np.mgrid[0:1,0:1,0:1].reshape(3,1,1).transpose(1,2,0) size = np.empty((1,1,3)) size[...,0:2] = 1 size[...,2] = 5 # 初始化时设置红色(RGBA格式,值范围0-1) bg = gl.GLBarGraphItem(pos, size, color=(1., 0., 0., 1.)) w.addItem(bg) if __name__ == '__main__': import sys if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): QtGui.QApplication.instance().exec_()
方法2:动态修改颜色
如果需要在运行时改变颜色,可以直接修改GLBarGraphItem的color属性,然后调用update()方法刷新:
比如在你的代码中,添加如下代码(可以放在事件触发或者定时器逻辑里):
# 修改为绿色,注意颜色数组的形状要和柱状图数量匹配 bg.color = np.array([[[0., 1., 0., 1.]]]) bg.update()
方法3:实现堆叠3D柱状图的多色效果
要做堆叠的3D柱状图,最直接的方式是把每个堆叠层做成独立的GLBarGraphItem,分别设置颜色,然后调整它们的位置让它们堆叠起来:
from pyqtgraph.Qt import QtCore, QtGui import pyqtgraph.opengl as gl import numpy as np app = QtGui.QApplication([]) w = gl.GLViewWidget() w.opts['distance'] = 100 w.showMaximized() w.setWindowTitle('pyqtgraph example: Stacked GLBarGraph') ax = gl.GLAxisItem() ax.setSize(20,20,20) w.addItem(ax) # 底层柱子:位置z=0,高度3,蓝色 pos_bottom = np.mgrid[0:1,0:1,0:1].reshape(3,1,1).transpose(1,2,0) size_bottom = np.empty((1,1,3)) size_bottom[...,0:2] = 1 size_bottom[...,2] = 3 bar_bottom = gl.GLBarGraphItem(pos_bottom, size_bottom, color=(0., 0., 1., 1.)) w.addItem(bar_bottom) # 上层柱子:位置z=3(和底层高度一致,实现堆叠),高度2,红色 pos_top = pos_bottom.copy() pos_top[...,2] = 3 # 把z轴位置设为底层的高度 size_top = np.empty((1,1,3)) size_top[...,0:2] = 1 size_top[...,2] = 2 bar_top = gl.GLBarGraphItem(pos_top, size_top, color=(1., 0., 0., 1.)) w.addItem(bar_top) if __name__ == '__main__': import sys if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): QtGui.QApplication.instance().exec_()
这样就能得到一个上下两层不同颜色的堆叠3D柱状图啦。
内容的提问来源于stack exchange,提问作者New2coding
相关产品推荐
相关产品推荐

