我在python 3.5,pyqt5和matplotlib 1.5.3中编写了一个程序,我在其中使用了pyplot互动模式。这里是一个最小示例:
import numpy as np
import matplotlib.pyplot as plt
plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111)
ax.grid(True)
for i in range (0, 10):
plt.scatter(i, np.sin(i))
fig.canvas.draw()
plt.ioff()
plt.show()
因为现在我正在编写GUI,而我无法使用Pyplot,因为它自己的Eventloop会干扰QT,所以我正在重写代码的那部分,但是我没有找到相当于交互式模式带有PYQT5的Matplotlib小部件。这是基本示例:
import sys
import time
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import numpy as np
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget
if __name__ == '__main__':
fig = Figure()
canvas = FigureCanvas(fig)
ax = fig.add_subplot(111)
ax.grid(True)
for i in range (0, 10):
ax.scatter(i, np.sin(i))
fig.canvas.draw()
ui = QWidget()
toolbar = NavigationToolbar(canvas, ui, coordinates=True)
vbox = QVBoxLayout()
vbox.addWidget(canvas)
vbox.addWidget(toolbar)
ui.setLayout(vbox)
ui.show()
app = QApplication(sys.argv)
sys.exit(app.exec_())
我希望作为第一个示例,在每次迭代中都会更新绘图。如何修改代码?
谢谢!ciccio
这个问题正在显示如何在matplotlib和pyqt中进行交互式动画。因此,为了查看如何完成,请简单地参考此或任何其他相关问题。
代码的第一个问题是,它甚至在屏幕上显示窗口之前执行绘图循环。通常,在Guis中,总是最好是首先初始化窗口,然后启动应该发生的任何事情。
第二个问题目前隐藏在第一个问题之后,就是您在Guis主环内执行绘图环,以便在更长的循环时段,GUI会冻结。