如何更新matplotlib绘图事件驱动?
背景: 我想编写一个工具,显示我通过串口接收的测量值。 这些值将在串行连接设备具有测量值时发送,而不是在主机请求时发送。
现状:
似乎无法手动更新绘图。
当我多次调用plot()
- 函数时,将添加新图。与MATLAB或Octave类似,当您使用“hold on”-Option时。
大约10次通话后结束。然后冻结了。
当我在更新前清除数字时,整个情节消失。
至少,当绘图嵌入窗口时。
draw()
和show()
都不提供补救措施。
当我使用单个情节图时,没有简单的更新方法,因为在调用show()
之后,程序流程停留在此行,直到Window关闭。所以更新必须在一个单独的线程中完成。
当我使用动画时,这两个问题都将得到解决:
import sys
from PyQt4.QtGui import QApplication, QMainWindow, QDockWidget, QVBoxLayout,QTabWidget, QWidget
from PyQt4.QtCore import Qt
from matplotlib import pyplot, animation
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg
from random import randint
a = QApplication(sys.argv)
w = QMainWindow()
t = QTabWidget(w)
Tab1 = QWidget()
t.addTab(Tab1, '1st Plot')
t.resize(1280, 300)
x = [1, 2, 3]
Fig1 = pyplot.Figure();
Plot = Fig1.add_subplot(111);
Plot.plot(x)
Plot.grid();
layout = QVBoxLayout();
layout.addWidget(FigureCanvasQTAgg(Fig1));
Tab1.setLayout(layout);
def UpdateFunction(i):
x.append(randint(0, 10));
Plot.clear();
Plot.plot(x);
Plot.grid();
Anim = animation.FuncAnimation(Fig1, UpdateFunction, interval=500)
w.showMaximized()
sys.exit(a.exec_())
但这样的动画是时间触发的。 是否有更新事件触发的解决方案?
该事件应该是已完成的UART读入。
非常感谢你。 费边
答案 0 :(得分:2)
@tcaswell
谢谢!
这是我的实际代码:
import sys
from PyQt4.QtGui import QApplication, QMainWindow, QVBoxLayout,QTabWidget, QWidget
from PyQt4.QtCore import SIGNAL
from matplotlib import pyplot
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg
from random import randint
import time
from threading import Thread
a = QApplication(sys.argv)
w = QMainWindow()
t = QTabWidget(w)
Tab1 = QWidget()
t.addTab(Tab1, '1st Plot')
t.resize(1280, 300)
x = [];
x.append(randint(0, 10));
x.append(randint(0, 10));
x.append(randint(0, 10));
Fig1 = pyplot.Figure();
Plot = Fig1.add_subplot(111);
Line, = Plot.plot(x)
Plot.grid();
layout = QVBoxLayout();
layout.addWidget(FigureCanvasQTAgg(Fig1));
Tab1.setLayout(layout);
def triggerUpdate():
while True:
a.emit(SIGNAL('updatePlot()'));
time.sleep(2);
print('update triggered!\n')
def updateFunction():
x.append(randint(0, 10));
#Plot.clear();
Line.set_data(range(len(x)), x);
Fig1.canvas.draw_idle();
print('update done!\n')
a.connect(a, SIGNAL('updatePlot()'), updateFunction)
t = Thread(target=triggerUpdate);
t.start();
w.showMaximized()
sys.exit(a.exec_())
它好像在运行,但是剧情的内容没有更新。 情节没有画布。 (虽然它应该有一个,否则我现在不知道它在我命令它时的绘图。)
老实说,我已经不了解GUI的概念和情节foo了。缺少的画布由其育儿图覆盖。我真的没有得到它。如果有一个数字,什么可以处理多个情节,每个情节应该有自己的画布吗?
但我想,这就是问题所在。
非常感谢你。