Как вставить график matplotlib вставить в интерфейс на pyqt5

Есть определенный график, который строится с помощью matplotlib, нужно вставить его в интерфейс на PyQt5 (делался через Qt Designer). Как это можно сделать?


Ответы (2 шт):

Автор решения: Ted Mosby

Вот мой код: Первый, второй и четвертый графики строит нормально, видимо потому что там обычные графики. А когда начинает строить третий, программа просто вылетает. Скорее всего связано с тем, что третий график - это Роза ветров, построенная с помощью библиотеки windrose.

import sys  # sys нужен для передачи argv в QApplication
import os  # Отсюда нам понадобятся методы для отображения содержимого директорий
from PyQt5 import QtWidgets, QtCore, QtGui
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import design2  # Это наш конвертированный файл дизайна
from PyQt5.QtWidgets import QApplication, QMainWindow, QSizePolicy, QVBoxLayout
from matplotlib.backends.backend_qt5 import NavigationToolbar2QT as NavigationToolbar
from create_Graph import getGraph


class MyMplCanvas(FigureCanvas):
    def __init__(self, fig, parent=None):
        self.fig = fig
        FigureCanvas.__init__(self, self.fig)
        FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

class Window(QtWidgets.QMainWindow, design2.Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)  # Это нужно для инициализации нашего дизайна
        self.EnterBD_2.clicked.connect(self.getFileName)
        self.Button1.clicked.connect(self.getFirst)
        self.Button2.clicked.connect(self.getSecond)
        self.Button3.clicked.connect(self.getThird)
        self.Button4.clicked.connect(self.getFourth)
        self.wb_path = ""

    def getFileName(self):
        wb_path = QtWidgets.QFileDialog.getOpenFileName(self, "Выберите базу данных")
        self.wb_path = wb_path[0]

    def getFirst(self, Graph):
        Graph = getGraph(self.wb_path)
        self.fig = Graph.printGraphFirst()
        self.widget = QtWidgets.QVBoxLayout(self.widget)
        # получение объекта класса холста с нашим рисунком
        self.canavas = MyMplCanvas(self.fig)
        # Размещение экземпляра класса холста в шаблоне размещения
        self.widget.addWidget(self.canavas)
        # получение объекта класса панели управления холста
        self.toolbar = NavigationToolbar(self.canavas, self)
        # Размещение экземпляра класса панели управления в шаблоне размещения
        self.widget.addWidget(self.toolbar)

    def getSecond(self, Graph):
        Graph = getGraph(self.wb_path)
        self.fig = Graph.printGraphSecond()
        self.widget_2 = QtWidgets.QVBoxLayout(self.widget_2)
        # получение объекта класса холста с нашим рисунком
        self.canavas_2 = MyMplCanvas(self.fig)
        # Размещение экземпляра класса холста в шаблоне размещения
        self.widget_2.addWidget(self.canavas_2)
        # получение объекта класса панели управления холста
        self.toolbar = NavigationToolbar(self.canavas_2, self)
        # Размещение экземпляра класса панели управления в шаблоне размещения
        self.widget_2.addWidget(self.toolbar)

    def getThird(self, Graph):
        Graph = getGraph(self.wb_path)
        self.fig = Graph.printGraphThird()
        self.widget_3 = QtWidgets.QVBoxLayout(self.widget_3)
        # получение объекта класса холста с нашим рисунком
        self.canavas_3 = MyMplCanvas(self.fig)
        # Размещение экземпляра класса холста в шаблоне размещения
        self.widget_3.addWidget(self.canavas_3)
        # получение объекта класса панели управления холста
        self.toolbar = NavigationToolbar(self.canavas_3, self)
        # Размещение экземпляра класса панели управления в шаблоне размещения
        self.widget_3.addWidget(self.toolbar)

    def getFourth(self, Graph):
        Graph = getGraph(self.wb_path)
        self.fig = Graph.printGraphFourth()
        self.widget_4 = QtWidgets.QVBoxLayout(self.widget_4)
        # получение объекта класса холста с нашим рисунком
        self.canavas_4 = MyMplCanvas(self.fig)
        # Размещение экземпляра класса холста в шаблоне размещения
        self.widget_4.addWidget(self.canavas_4)
        # получение объекта класса панели управления холста
        self.toolbar = NavigationToolbar(self.canavas_4, self)
        # Размещение экземпляра класса панели управления в шаблоне размещения
        self.widget_4.addWidget(self.toolbar)

def main():
    app = QtWidgets.QApplication(sys.argv)  # Новый экземпляр QApplication
    window = Window()  # Создаём объект класса ExampleApp
    window.show()  # Показываем окно
    app.exec_()  # и запускаем приложение

Графики строятся в функциях в другом файле, которые возвращают fig. На всякий случай вот еще функция для построения графика, который не работает. Причем если запускать его просто как код - график выводит и такой как нужно, а вот в интерфейсе pyqt никак.

def printGraphThird(self):
    ws = []
    wd = []#здесь мы начинаем парсить значения в таблице
    for i in range(len(dataframe[sheet_names].axes[0]) - 1):
        ws.append(dataframe[sheet_names].iloc[i][4])
        if(str(dataframe[sheet_names].iloc[i][3]) == 'Северный'):
            wd.append(360)
        elif(str(dataframe[sheet_names].iloc[i][3]) == 'С-В'):
            wd.append(45)
        elif(str(dataframe[sheet_names].iloc[i][3]) == 'Восточный'):
            wd.append(90)
        elif(str(dataframe[sheet_names].iloc[i][3]) == 'Ю-В'):
            wd.append(135)
        elif(str(dataframe[sheet_names].iloc[i][3]) == 'Южный'):
            wd.append(180)
        elif(str(dataframe[sheet_names].iloc[i][3]) == 'Ю-З'):
            wd.append(225)
        elif(str(dataframe[sheet_names].iloc[i][3]) == 'Западный'):
            wd.append(270)
        elif(str(dataframe[sheet_names].iloc[i][3]) == 'С-З'):
            wd.append(315)
        elif(str(dataframe[sheet_names].iloc[i][3]) == 'Переменный' or str(dataframe['2012-12'].iloc[i][3]) == 'nan'):
            wd.append(0)
        plt.rcParams.update({'font.size': 14})
        ax = WindroseAxes.from_ax()
        ax.bar(wd, ws, normed=True, opening=1.5, edgecolor='white')
        ax.set_legend()
        return fig
→ Ссылка
Автор решения: Ted Mosby

Решение: по другому создавать сам график

fig = plt.figure()
plt.rcParams.update({'font.size': 14})
rect=[0.1, 0.1, 0.8, 0.8] 
ax=WindroseAxes(fig, rect)
fig.add_axes(ax)
ax.bar(wd, ws, normed=True, opening=1.5, edgecolor='white')
ax.set_legend()
#plt.show()
return fig
→ Ссылка