PyQtGraph窗口调整大小时ImageItem颜色映射重置为灰度问题
PyQtGraph窗口调整大小时ImageItem颜色映射重置为灰度的问题解决
问题描述
使用PyQt66.4.2、pyqtgraph0.13.3时,调整GraphicsLayoutWidget窗口大小,ImageItem的颜色映射会重置为灰度。初始窗口正常显示CET-R4颜色映射,但窗口resize或滑动HistogramLUTItem的渐变编辑器时,图像会变为灰度;移除hist.setImageItem(img)语句后,颜色映射不再变化。
相关代码:
# PyQt6==6.4.2 # pyqtgraph==0.13.3 import numpy as np import pyqtgraph as pg from pyqtgraph.Qt import QtGui # Interpret image data as row-major instead of col-major pg.setConfigOptions(imageAxisOrder='row-major') pg.mkQApp() win = pg.GraphicsLayoutWidget() # A plot area (ViewBox + axes) for displaying the image p1 = win.addPlot(title="") # Item for displaying image data img = pg.ImageItem() p1.addItem(img) # Contrast/color control hist = pg.HistogramLUTItem() hist.setImageItem(img) # removing this line prevents the colorMap from changing when resizing the window win.addItem(hist) # Generate image data data = np.random.normal(size=(200, 100)) img.setImage(data) img.setColorMap(pg.colormap.get('CET-R4')) hist.setLevels(data.min(), data.max()) win.show() if __name__ == '__main__': pg.exec()
原因分析
这是pyqtgraph 0.13.3版本的已知Bug,不是操作错误。当HistogramLUTItem与ImageItem关联后,窗口resize或操作渐变编辑器时,HistogramLUTItem会自动将ImageItem的颜色映射重置为默认的灰度映射,覆盖之前设置的自定义颜色映射。
修复/规避方法
方法1:调整设置顺序,同步颜色映射
先给ImageItem设置颜色映射,再同步设置HistogramLUTItem的颜色映射,最后关联两者。修改后的代码如下:
# PyQt6==6.4.2 # pyqtgraph==0.13.3 import numpy as np import pyqtgraph as pg from pyqtgraph.Qt import QtGui # Interpret image data as row-major instead of col-major pg.setConfigOptions(imageAxisOrder='row-major') pg.mkQApp() win = pg.GraphicsLayoutWidget() # A plot area (ViewBox + axes) for displaying the image p1 = win.addPlot(title="") # Item for displaying image data img = pg.ImageItem() p1.addItem(img) # Contrast/color control hist = pg.HistogramLUTItem() # Generate image data data = np.random.normal(size=(200, 100)) img.setImage(data) # 先获取并设置颜色映射 cmap = pg.colormap.get('CET-R4') img.setColorMap(cmap) hist.setColorMap(cmap) # 同步直方图的颜色映射 # 再关联ImageItem hist.setImageItem(img) win.addItem(hist) hist.setLevels(data.min(), data.max()) win.show() if __name__ == '__main__': pg.exec()
方法2:升级pyqtgraph版本
该Bug在pyqtgraph 0.14.0及以上版本中已被修复,直接升级到最新稳定版即可解决问题。可以用pip命令升级:
pip install --upgrade pyqtgraph
方法3:手动监听resize事件重置颜色映射(不推荐)
如果无法升级版本,可以监听窗口的resize事件,在窗口大小变化后重新设置颜色映射。但这种方法需要额外处理信号,不如前两种方法简洁可靠,示例代码如下:
# 在原代码基础上添加以下内容 def reset_colormap(): img.setColorMap(pg.colormap.get('CET-R4')) # 绑定窗口resize事件 win.resizeEvent = lambda event: (QtGui.QWidget.resizeEvent(win, event), reset_colormap())
内容的提问来源于stack exchange,提问作者Teun
相关产品推荐
相关产品推荐

