Skip to content Skip to sidebar Skip to footer

Display Matplotlib Plots From Other File

I have a PyQt file that, on the click of a button, runs a function from another python file (let's call calc.py) that carries out a really advanced calculation and uses matplotlib

Solution 1:

The solution is a hack(may fail in the future) that assumes that the backend used by matplotlib in calc.py uses PyQt5, for this it is necessary to import PyQt5 first and then calc.py.

The logic is to make matplotlib not block the eventloop using plt.ion, and then search among the toplevels (windows) that have a FigureCanvas as their centralWidget.

calc.py

import matplotlib.pyplot as plt
import numpy as np


def do_calc():
    t = np.arange(0.0, 2.0, 0.01)
    s = 1 + np.sin(2 * np.pi * t)

    fig, ax = plt.subplots()
    ax.plot(t, s)

    ax.set(
        xlabel="time (s)",
        ylabel="voltage (mV)",
        title="About as simple as it gets, folks",
    )
    ax.grid()
    plt.show()

main.py

import sys

from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QVBoxLayout, QWidget

import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvas

from calc import do_calc



classWindow(QMainWindow):
    def__init__(self, parent=None):
        super(Window, self).__init__(parent)

        self.title_label = QLabel("Label Text")

        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        lay = QVBoxLayout(central_widget)
        lay.addWidget(self.title_label)

        plt.ion()
        do_calc()

        for tl in QApplication.topLevelWidgets():
            ifisinstance(tl, QMainWindow) andisinstance(
                tl.centralWidget(), FigureCanvas
            ):
                lay.addWidget(tl)


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

Another better option is to get all the Figures and then the canvas and finally the window of that canvas:

classWindow(QMainWindow):
    def__init__(self, parent=None):
        super(Window, self).__init__(parent)

        self.title_label = QLabel("Label Text")

        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        lay = QVBoxLayout(central_widget)
        lay.addWidget(self.title_label)

        plt.ion()
        do_calc()

        for i in plt.get_fignums():
            canvas = plt.figure(i).canvas
            ifisinstance(canvas, QWidget):
                lay.addWidget(canvas.window())

Post a Comment for "Display Matplotlib Plots From Other File"