使用matplotlib和pyqt5生成实时绘图



我想使用matplotlib和pyqt5创建一个实时绘图,但如果我没有错的话,它会因为FuncAnimation模块的第一个参数而出错,我不知道在这里写什么。我愿意接受任何关于代码的建议。

代码如下:

第一部分:

from PyQt5.QtWidgets import*
from matplotlib.backends.backend_qt5agg import FigureCanvas
from matplotlib.figure import Figure   
class MplWidget(QWidget):   
def __init__(self, parent = None):
QWidget.__init__(self, parent)

self.canvas = FigureCanvas(Figure())

vertical_layout = QVBoxLayout()
vertical_layout.addWidget(self.canvas)

self.canvas.axes = self.canvas.figure.add_subplot(111)
self.setLayout(vertical_layout)

第二部分:

from PyQt5.QtWidgets import*
from PyQt5.uic import loadUi
from matplotlib.backends.backend_qt5agg import (NavigationToolbar2QT as NavigationToolbar)
import numpy as np
import random
import random
from itertools import count
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
x_vals = []
y_vals = []
index = count()

class MatplotlibWidget(QMainWindow):

def __init__(self):

QMainWindow.__init__(self)
loadUi("livegraph.ui",self)
self.setWindowTitle("PyQt5 Graph")
self.update_graph()
self.addToolBar(NavigationToolbar(self.MplWidget.canvas, self))

def update_graph(self):
self.ani = FuncAnimation(self.MplWidget.canvas, self.animate, interval=1000)
self.show()

def animate(self,i):
data = pd.read_csv('data.csv')
x = data['x_value']
y1 = data['total_1']
y2 = data['total_2']
plt.cla()
self.MplWidget.canvas.axes.clear()
self.MplWidget.canvas.axes.plot(x, y1, label='Altitude')
self.MplWidget.canvas.axes.plot(x, y2, label='Velocity')
self.MplWidget.canvas.axes.set_title('Time-Velocity/Altitude')
self.MplWidget.canvas.axes.legend(loc='upper right')




app = QApplication([])
window = MatplotlibWidget()
window.show()
app.exec_()

错误部分如下

Traceback (most recent call last):
File "C:UsersslaloDesktoplivegraphnewmain.py", line 63, in <module>
window = MatplotlibWidget()
File "C:UsersslaloDesktoplivegraphnewmain.py", line 36, in __init__
self.update_graph()
File "C:UsersslaloDesktoplivegraphnewmain.py", line 42, in update_graph
self.ani = FuncAnimation(self.MplWidget.canvas, self.animate, interval=1000)
File "C:Usersslaloanaconda3libsite-packagesmatplotlibanimation.py", line 1656, in __init__
TimedAnimation.__init__(self, fig, **kwargs)
File "C:Usersslaloanaconda3libsite-packagesmatplotlibanimation.py", line 1414, in __init__
event_source = fig.canvas.new_timer(interval=self._interval)
AttributeError: 'FigureCanvasQTAgg' object has no attribute 'canvas'

FuncAnimation的第一个参数需要画布的Figure,而不需要画布。解决方案是更改为:

self.ani = FuncAnimation(
self.MplWidget.canvas.figure, self.animate, interval=1000
)

最新更新