pyqtgraph 中的 matplotlib.pyplot.clim 对应项

Posted

技术标签:

【中文标题】pyqtgraph 中的 matplotlib.pyplot.clim 对应项【英文标题】:matplotlib.pyplot.clim counterpart in pyqtgraph 【发布时间】:2021-11-20 19:51:43 【问题描述】:

我只想将颜色图(“热”)应用于图像的某个值范围。我已经从 matplotlib.pyplot.clim 中知道了这个功能,您必须在其中指定缩放的最小值和最大值。据我了解,您应该为此使用 setLevels([min,max]) 。 我已经包含了一个最小的示例,它表明两种表示很遗憾是不等价的。

import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
import os
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui#, QtWidgets
#import PyQt5.QtCore
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QPushButton, QFileDialog, \
    QScrollArea, QVBoxLayout, QGroupBox, QLabel, QFormLayout, QComboBox, QHBoxLayout
from skimage import io    
import sys


def main():
    imarray = np.random.rand(100, 100) * 515
    imarray = np.clip(imarray, 0, 515)
    plt_example(imarray)
    pyqtgraph_example(imarray)

def plt_example(data):
    plt.imshow(data, cmap='hot')
    c = plt.colorbar()
    plt.clim(0, 200)
    plt.show()


def pyqtgraph_example(data):
    colormap = cm.get_cmap("hot")
    colormap._init()
    lut = (colormap._lut * 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)
    img.setLevels([0, 200]) # same functionality as clim?
    img.setLookupTable(lut)

    app.exec()

if __name__ == "__main__":
    main()

您知道如何在 pyqtgraph 中获得与 matplotlib 中的 clim 相同的表示吗? 第一张图显示了使用 matplotlib 的结果,第二张图显示了使用 pyqtgraph 的结果。

【问题讨论】:

【参考方案1】:

这个问题被带到了 pyqtgraph 问题跟踪器:https://github.com/pyqtgraph/pyqtgraph/pull/1985#issuecomment-932223288

这里有一些代码可以在两个库之间生成相同的结果

import matplotlib.pyplot as plt
import numpy as np
import pyqtgraph as pg

def main():
    imarray = np.random.rand(100, 100) * 515
    imarray = np.clip(imarray, 0, 515)
    plt_example(imarray)
    pyqtgraph_example(imarray)

def plt_example(data):
    plt.imshow(data, cmap='hot')
    c = plt.colorbar()
    plt.clim(0, 200)
    plt.show(block=False)

def pyqtgraph_example(data):
    app = pg.mkQApp("Test")
    win = pg.GraphicsLayoutWidget()
    win.setWindowTitle('pyqtgraph example: ImageItem')
    win.show()

    # add plot with correct axis orientation and locked aspect ratio
    plot = win.addPlot()
    plot.setAspectLocked(True)
    plot.invertY()

    # Create image item
    img = pg.ImageItem(data, axisOrder='row-major')
    plot.addItem(img)

    # Create color bar and have it control image levels    
    cmap = pg.colormap.getFromMatplotlib('hot')
    cbi = pg.ColorBarItem(colorMap=cmap)
    cbi.setImageItem(img, insert_in=plot)
    cbi.setLevels([0, 200]) # colormap range

    app.exec()

if __name__ == "__main__":
    main()

问题跟踪器中此代码的发布者指出,“溢出”值似乎在 matplotlib 中呈现为白色,而在 pyqtgraph 中呈现为黑色。另外,pyqtgraph图像由于轴顺序未设置,y轴可能是反转的,所以向左旋转了90度。

要获得正确的旋转方向,代码有两行注释

plot.invertY()

pg.ImageItem(data, axisOrder='row-major')

希望这会有所帮助!

【讨论】:

以上是关于pyqtgraph 中的 matplotlib.pyplot.clim 对应项的主要内容,如果未能解决你的问题,请参考以下文章

在 pyqtgraph 中的图像上显示网格线

在 pyqtgraph 中的多个图上链接自动缩放

pyqtgraph中的两个轴图w.r.t时间

如何更新pyqtgraph中的绘图?

使用 GLVolumeItem 在 pyqtgraph 中的最大强度投影

如何清除 PYQTGRAPH 中的 ScatterPlotItem