【发布时间】:2020-04-05 12:02:56
【问题描述】:
从将 matplotlib 嵌入 Qwidget 开始,我遵循了以下教程: https://yapayzekalabs.blogspot.com/2018/11/pyqt5-gui-qt-designer-matplotlib.html
文件可以在这里下载: https://drive.google.com/drive/folders/10V1Nh1xAVAfwydBtsJvoVGaYiR_HI15X?usp=sharing
本教程包含一个 mplwidget.py 文件:
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)
main.py:
from PyQt5.QtWidgets import*
from PyQt5.uic import loadUi
from matplotlib.backends.backend_qt5agg import (NavigationToolbar2QT as NavigationToolbar)
import numpy as np
import random
class MatplotlibWidget(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
loadUi("qt_designer.ui",self)
self.setWindowTitle("PyQt5 & Matplotlib Example GUI")
self.pushButton_generate_random_signal.clicked.connect(self.update_graph)
self.addToolBar(NavigationToolbar(self.MplWidget.canvas, self))
def update_graph(self):
fs = 500
f = random.randint(1, 100)
ts = 1/fs
length_of_signal = 100
t = np.linspace(0,1,length_of_signal)
cosinus_signal = np.cos(2*np.pi*f*t)
sinus_signal = np.sin(2*np.pi*f*t)
self.MplWidget.canvas.axes.clear()
self.MplWidget.canvas.axes.plot(t, cosinus_signal)
self.MplWidget.canvas.axes.plot(t, sinus_signal)
self.MplWidget.canvas.axes.legend(('cosinus', 'sinus'),loc='upper right')
self.MplWidget.canvas.axes.set_title('Cosinus - Sinus Signal')
self.MplWidget.canvas.draw()
app = QApplication([])
window = MatplotlibWidget()
window.show()
app.exec_()
还有 qt_designer.ui 文件,它有一个按钮和一个 Qwidget(在 QT Designer 中升级为 MplWidget)。
这对于静态 matplotlib 图形非常有用,但似乎无法制作动画。我想我不明白在这种情况下被视为figure。我需要寄什么给
FuncAnimation(fig, func, frames=None, init_func=None, fargs=None, save_count=None, *, cache_frame_data=True, **kwargs)[source]
将图形显示为动画,假设 10 个随机图形一个接一个地显示?
我试过把代码改成这样:
#In the init function
self.pushButton_generate_random_signal.clicked.connect(self.update_animation)
def update_animation(self):
self.ani = animation.FuncAnimation(self.MplWidget.canvas, self.update_graph, interval=1000)
self.MplWidget.canvas.draw()
def update_graph(self):
for k in range(1, 10):
fs = 500
f = random.randint(1, 100)
ts = 1/fs
length_of_signal = 100
t = np.linspace(0,1,length_of_signal)
cosinus_signal = np.cos(2*np.pi*f*t)
sinus_signal = np.sin(2*np.pi*f*t)
self.MplWidget.canvas.axes.clear()
self.MplWidget.canvas.axes.plot(t, cosinus_signal)
self.MplWidget.canvas.axes.plot(t, sinus_signal)
但这完全破坏了python。大多数示例研究使用 matplotlib.pyplot 作为带有fig = plt.plot 的 plt。所以我想我不明白如何将MplWidget 设置为情节。任何帮助将不胜感激。谢谢
【问题讨论】:
-
把
ani改成self.ani -
感谢您的提示。有意义的是它应该是自我并编辑了帖子,但它仍然不起作用。
-
感谢 eyllanesc。让它工作并发布答案,尽管它似乎在完成 10 个循环后重新启动动画。
标签: python matplotlib animation qt-designer