Как использовать BytesIO с matplotlib и pyqt5?

Я сделал график в matplotlib и хотел добавить его в изображение и использовать в своем приложении pyqt5. Кто-то предложил мне использовать для этого BytesIO. Это мой код на данный момент:

Рисуем мой график:

...
plt.axis('equal')
buff = io.BytesIO()
plt.savefig(buff, format="png")
print(buff)
return buff

Затем это вызывается в другом скрипте:

def minionRatioGraphSetup(self, recentMinionRatioAvg):
    image = minionRatioGraph(recentMinionRatioAvg)
    label = QtWidgets.QLabel()
    pixmap = QtGui.QPixmap(image)
    label.setPixmap(pixmap)
    label.setGeometry(QtCore.QRect(0,0,200,200))

Он перестает работать на pixmap = QtGui.QPixmap(image), и я не знаю почему. Также: как я могу разместить это в моем MainWindow? потому что я сомневаюсь, что код там будет работать, лол


person Taylor Hetherington    schedule 18.04.2017    source источник


Ответы (2)


Я уверен, что есть решение с использованием буфера. Однако получить правильный формат байта кажется довольно сложным. Таким образом, можно сохранить образ на диск, а затем загрузить его оттуда.

import sys
from PyQt4 import QtGui
import matplotlib.pyplot as plt
import numpy as np

def minionRatioGraph():
    plt.plot([1,3,2])
    plt.savefig(__file__+".png", format="png")


class App(QtGui.QWidget):

    def __init__(self):
        super(App, self).__init__()
        self.setGeometry(300, 300, 250, 150)
        self.setLayout(QtGui.QVBoxLayout())
        label = QtGui.QLabel()
        label2 = QtGui.QLabel("Some other text label") 

        minionRatioGraph()

        qimg = QtGui.QImage(__file__+".png")  
        pixmap = QtGui.QPixmap(qimg)

        label.setPixmap(pixmap)
        self.layout().addWidget(label)
        self.layout().addWidget(label2)
        self.show()


if __name__ == '__main__':
    app = QtGui.QApplication([])
    ex = App()
    sys.exit(app.exec_())
person ImportanceOfBeingErnest    schedule 18.04.2017
comment
спасибо, чувак, ты спасатель. Я выдергивал волосы из-за этого ха-ха - person Taylor Hetherington; 19.04.2017

фрагмент с использованием подушки, может помочь избежать файла io

 im = PIL.Image.open("filename")
 with BytesIO() as f:
     im.save(f, format='png')
     f.seek(0)
     image_data = f.read()
     qimg = QImage.fromData(image_data)
     patch_qt = QPixmap.fromImage(qimg)
person K.Z.D    schedule 01.02.2018