如果你在使用Matplotlib和PyQt5时遇到图形在运行时不更新的问题,可能是因为你没有正确地更新和重绘图形。以下是一个基本的例子,展示了如何在PyQt5的窗口中动态更新Matplotlib图形:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QSizePolicy, QWidget
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import numpy as np
import random
class MyMplCanvas(FigureCanvas):
def __init__(self, parent=None, width=5, height=4, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111)
FigureCanvas.__init__(self, fig)
self.setParent(parent)
FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self)
def plot(self):
data = [random.random() for i in range(25)]
self.axes.plot(data, 'r')
self.draw()
class ApplicationWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.main_widget = QWidget(self)
layout = QVBoxLayout(self.main_widget)
self.canvas = MyMplCanvas(self.main_widget, width=5, height=4, dpi=100)
layout.addWidget(self.canvas)
self.main_widget.setFocus()
self.setCentralWidget(self.main_widget)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = ApplicationWindow()
window.setWindowTitle("Matplotlib in PyQt5")
window.show()
# Update the plot every second
timer = QtCore.QTimer()
timer.timeout.connect(window.canvas.plot)
timer.start(1000)
sys.exit(app.exec_())
在这个例子中,我们创建了一个MyMplCanvas
类,它是FigureCanvas
的子类,用于在PyQt5窗口中显示Matplotlib图形。plot
方法用于更新图形,并使用draw
方法重绘图形。
然后,我们在ApplicationWindow
类中创建了一个MyMplCanvas
实例,并将其添加到布局中。
最后,我们使用QtCore.QTimer
每秒调用plot
方法,以动态更新图形。
领取专属 10元无门槛券
手把手带您无忧上云