QLabel上的Matplotlib子图提供不同的色彩Map表

yh2wf1be  于 2023-02-05  发布在  其他
关注(0)|答案(1)|浏览(172)

当我在QLabel上绘制Matplotlib子图时,我得到的颜色Map表与保存到文件时不同。我如何用QT显示真实的的颜色Map表?例如,在下面的代码中,磁盘上的图像具有良好的红蓝颜色Map表,但QT的颜色Map表是蓝暗橙子的。我尝试了其他QImage格式,但到目前为止效果不佳。

import sys
import numpy as np
import matplotlib.pyplot as plt

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel
from PyQt5.QtGui import QImage, QPixmap

class Window(QMainWindow):
    def __init__(self):
        # window design
        super().__init__()
        self.setFixedSize(1000, 400)
        
        # create QT element
        self.wid_labelGraph = QLabel(self)
        self.wid_labelGraph.setStyleSheet("background-color : white;")
        
        self.setCentralWidget(self.wid_labelGraph)
        self.make_graphs()

    def make_graphs(self):
        # generate graph
        heatmaps = [ np.ones((50, 50)), np.zeros((50, 50)), -1 * np.ones((50, 50)) ]

        fig, axs = plt.subplots(1, 3, figsize = (10, 4))
        for i in range(3):
            im = axs[i].imshow(heatmaps[i], cmap = 'RdBu_r', clim = (-1, 1))
            axs[i].set_axis_off()
        fig.colorbar(im, ax = axs.ravel().tolist())
        fig.savefig('temp.png')

        canvas = FigureCanvas(fig)
        canvas.draw()
        width, height = fig.figbbox.width, fig.figbbox.height
        img = QImage(canvas.buffer_rgba(), width, height, QImage.Format_ARGB32)
        self.wid_labelGraph.setPixmap(QPixmap(img))

        # free memory
        plt.close()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    app.exec()
drkbr07n

drkbr07n1#

格式错误。
您正在使用Format_ARGB32
图像使用32位ARGB格式(0xAARRGGBB)存储。
但是,正如函数名buffer_rgba()所示,格式是rgba,因此Format_RGBA8888
该图像使用32位字节顺序RGBA格式(8-8-8 -8)存储。与ARGB 32不同,这是一种字节顺序格式,这意味着32位编码在大端和小端体系结构之间不同,分别为(0xRRGGBBAA)和(0xAABBGGRR)。如果读取为字节0xRR、0xGG、0xBB、0xAA,则颜色的顺序在任何体系结构上都是相同的。
您得到了错误的颜色,因为引用组件的位被 * 移位 *:红色被解释为α、绿色为红色、蓝色被解释为绿色、α被解释为蓝色。

相关问题