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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:05:52