pyqtgraph实现matplotlib.pyplot.clim等效色阶限制功能求助
问题原因
两者渲染效果不一致是因为两处代码逻辑偏差:
- 从matplotlib的
hotcolormap导出查找表(LUT)时,colormap._lut默认包含256个常规色值 + 3个特殊色值(分别对应超上限、超下限、无效值的显示颜色),全量传入pyqtgraph会导致色阶映射偏移 - pyqtgraph的
setLookupTable方法默认会自动重置图像的levels为LUT适配范围,你提前手动设置的[0,200]levels会被自动覆盖
修正方案
修改pyqtgraph_example函数的LUT导出和设置逻辑即可,修改后代码如下:
def pyqtgraph_example(data): colormap = cm.get_cmap("hot") colormap._init() # 仅取前256个常规色值,排除末尾3个特殊色值 lut = (colormap._lut[:256] * 255).view(np.ndarray) app = pg.mkQApp("Test") win = pg.GraphicsLayoutWidget() win.show() win.setWindowTitle('pyqtgraph example: ImageItem') view = win.addViewBox() # lock the aspect ratio so pixels are always square view.setAspectLocked(True) # Create image item img = pg.ImageItem() view.addItem(img) img.setImage(data) # 先设置LUT,同时禁止自动更新levels覆盖手动配置 img.setLookupTable(lut, update_levels=False) # 再手动设置levels,等效matplotlib的clim(0,200) img.setLevels([0, 200]) app.exec()
修正后:
- 像素值<0的区域统一显示hot色阶的最低值(黑色)
- 像素值在0~200区间的内容线性映射到整个hot色阶
- 像素值>200的区域统一显示hot色阶的最高值(亮白色)
和matplotlib的plt.clim(0,200)效果完全一致。
内容的提问来源于stack exchange,提问作者bobby
相关产品推荐
相关产品推荐

