Прохождение участка / осей matplotlib для встроенных графиков PyQt5 - PullRequest
0 голосов
/ 13 ноября 2018

У меня вчера был вопрос о том, как обновить встроенный сюжет matplotlib в графическом интерфейсе pyqt5 с панелью инструментов, которая теперь работает нормально. Но в моем приложении это более сложно по сравнению с минимальным примером.

У меня есть класс, который выполняет анализ и создает графики с помощью matplotlib, пока графический интерфейс пользователя находится в отдельном классе в другом файле. Я сделал модифицированный минимальный пример:

# -*- coding: utf-8 -*-

import sys
import numpy as np

from PyQt5 import QtCore, QtWidgets, uic

import matplotlib
matplotlib.use('QT5Agg')

import matplotlib.pylab as plt

from matplotlib.backends.qt_compat import QtCore, QtWidgets, is_pyqt5
from matplotlib.backends.backend_qt5agg import FigureCanvas, NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure

class Analysis():

    def __init__(self):

        self.fig, self.ax1 = plt.subplots()

        bins = np.arange(0.1, 2, 0.02)
        data = np.random.rand(3,2)        
        self.ax1.hist(data, bins, alpha=0.6, density=False, cumulative=False)      

    def getAxis(self):
        return self.ax1


class MyWindow(QtWidgets.QMainWindow):

    def __init__(self):

        super(MyWindow, self).__init__()
        uic.loadUi('test.ui', self) 

        # default data
        data = np.array([0.7,0.7,0.7,0.8,0.9,0.9,1.5,1.5,1.5,1.5])        
        self.fig, self.ax1 = plt.subplots()

        bins = np.arange(0.1, 2, 0.02)
        n1, bins1, patches1 = self.ax1.hist(data, bins, alpha=0.6, density=False, cumulative=False)

        # plot
        self.plotWidget = FigureCanvas(self.fig)
        self.lay = QtWidgets.QVBoxLayout(self.content_plot)  
        self.lay.setContentsMargins(0, 0, 0, 0)      
        self.lay.addWidget(self.plotWidget)

        # add toolbar
        self.addToolBar(QtCore.Qt.BottomToolBarArea, NavigationToolbar(self.plotWidget, self))        

        # button event
        self.pushButton.clicked.connect(self.update)

        # show window
        self.show() 

    #############################################     

    def update(self):

        # clear local axis
        self.ax1.cla()   

        # get axis from analysis object
        a = Analysis()        
        ax = a.getAxis()

        # ???????????
        self.ax1 = ax

        # draw the new content
        self.fig.canvas.draw_idle()  



if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    sys.exit(app.exec_())

Идея состоит в том, чтобы создать объект matplotlib в классе Analysis и сохранить оси результатов, чтобы получить их в другом методе для его построения во встроенном виджете PyQt5.

Но мой код не работает. Он очищает локальные оси, но не устанавливает оси из объекта анализа. Как я могу сделать это правильно?

Спасибо!

1 Ответ

0 голосов
/ 13 ноября 2018

Вы создаете новую фигуру и оси в своем классе Analysis.Вы не можете взять одну ось из одной фигуры и поместить ее в другую фигуру просто так.Вместо этого создайте класс Analysis, чтобы он принимал объект Axes при инициализации.

Возможно, вы захотите прочитать документ в стиле кодирования matplotlib .

class Analysis():
    def __init__(self, ax=None):
        if ax is None:
            ax = plt.gca()

        bins = np.arange(0.1, 2, 0.02)
        data = np.random.rand(3,2)        
        ax.hist(data, bins, alpha=0.6, density=False, cumulative=False)

(...)

    def update(self):

        # clear local axis
        self.ax1.cla()   
        a = Analysis(ax=self.ax1)        
        self.fig.canvas.draw_idle()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...