В этом посте я спросил, как встроить график matplotlib в графический интерфейс pyqt5, который сейчас работает нормально. Теперь у меня есть еще одна проблема, которую я не мог решить до сих пор: как я могу обновить фигуру?
Я попытался обновить холст, вызвав
self.plotWidget = FigureCanvas(fig)
каждый раз с новым "фиговым" объектом, но ничего не происходило. Поэтому я попытался добавить его в макет
self.lay.addWidget(self.plotWidget)
но это добавляет еще один субплот к виджету. Я предполагаю, что мне нужно очистить предыдущий график перед обновлением, но я не знаю, как это сделать.
Какова правильная стратегия для реплота с использованием метода обновления?
Спасибо!
# -*- 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 MyWindow(QMainWindow):
def __init__(self):
super(MyWindow, self).__init__()
uic.loadUi('test.ui', self)
# test data
data = np.array([0.7,0.7,0.7,0.8,0.9,0.9,1.5,1.5,1.5,1.5])
fig, ax1 = plt.subplots()
bins = np.arange(0.6, 1.62, 0.02)
n1, bins1, patches1 = ax1.hist(data, bins, alpha=0.6, density=False, cumulative=False)
# plot
self.plotWidget = FigureCanvas(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):
data = np.array([0.1,0.1,0.1,0.1,0.3,0.3,1.7,1.7,1.7,1.7])
fig, ax1 = plt.subplots()
bins = np.arange(0.6, 1.62, 0.02)
n1, bins1, patches1 = ax1.hist(data, bins, alpha=0.6, density=False, cumulative=False)
# show plot in canvas
self.plotWidget = FigureCanvas(fig)
self.toolbarWidget = NavigationToolbar(self.plotWidget, self)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
sys.exit(app.exec_())