У меня вчера был вопрос о том, как обновить встроенный сюжет 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.
Но мой код не работает. Он очищает локальные оси, но не устанавливает оси из объекта анализа. Как я могу сделать это правильно?
Спасибо!