TypeError: QPixmap(): аргумент 1 има неочакван тип „Фигура“

Опитвам се да направя графика с помощта на matplotlib и да я начертая директно в Qlabel с помощта на Qpixmap. Въпреки това се случва грешката QPixmap (): аргумент 1 има неочакван тип „Фигура“. Как да покажа графиката, без да я записвам преди това?

import matplotlib.pyplot as plt
import numpy as np

labels = ['Word', 'Excel', 'Chrome','Visual Studio Code'] 
title = [20,32,22,25] 
cores = ['lightblue','green','blue','red']
explode = (0,0.1,0,0)
plt.rcParams['font.size'] = '16'
total=sum(title)
plt.pie(title,explode=explode,labels=labels,colors=cores,autopct=lambda p: '{:.0f}'.format(p*total/100), shadow=True, startangle=90)
plt.axis('equal')
grafic = plt.gcf()
self.ui.grafig_1.setPixmap(QPixmap(grafic))

person LucasRussi    schedule 06.12.2020    source източник


Отговори (1)


Не можете да конвертирате Figure към QPixmap директно, така че получавате това изключение. Вместо това трябва да получите байтовете на изображението, генерирано от savefig() метод на Figure и с него създайте QPixmap :

import io
import sys

import matplotlib.pyplot as plt
import numpy as np

from PyQt5 import QtGui, QtWidgets


labels = ["Word", "Excel", "Chrome", "Visual Studio Code"]
title = [20, 32, 22, 25]
cores = ["lightblue", "green", "blue", "red"]
explode = (0, 0.1, 0, 0)
plt.rcParams["font.size"] = "16"
total = sum(title)
plt.pie(
    title,
    explode=explode,
    labels=labels,
    colors=cores,
    autopct=lambda p: "{:.0f}".format(p * total / 100),
    shadow=True,
    startangle=90,
)
plt.axis("equal")
grafic = plt.gcf()

f = io.BytesIO()
grafic.savefig(f)

app = QtWidgets.QApplication(sys.argv)

label = QtWidgets.QLabel()
pixmap = QtGui.QPixmap()
pixmap.loadFromData(f.getvalue())
label.setPixmap(pixmap)
label.show()

sys.exit(app.exec_())

Забележка: Не е необходимо да се преобразува в QPixmap, за да се покаже диаграма на matplotlib, тъй като matplotlib позволява да се използва Qt като бекенд, препоръчвам да проверите следната публикация:

person eyllanesc    schedule 06.12.2020