如何更新 matplotlib 绘图事件驱动?
背景: 我想编写一个工具来显示通过串行端口接收到的测量值。 这些值将由串行连接设备在有测量值时发送,而不是在主机请求时发送。
当前状态:
似乎没有办法手动更新绘图。
当我多次调用 plot()
函数时,将添加新的绘图。与 MATLAB 或 Octave 类似,当您使用“hold on”选项时。
大约 10 次通话后,此过程结束。然后它被卡住。
当我在更新之前清除数字时,整个情节就会消失。
至少,当绘图嵌入到窗口中时。
draw()
和 show()
都没有提供补救措施。
当我使用单个绘图时,没有简单的方法来更新,因为在调用 show()
后,程序流程会停留在这一行,直到窗口关闭。因此更新必须在单独的线程中完成。
当我使用动画时,这两个问题都会得到解决:
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 读入。
非常感谢。 费边
最佳答案
@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_())
似乎可以运行,但剧情内容没有更新。 该情节没有 Canvas 。 (虽然它应该有一个,否则我现在不知道当我命令它时它正在绘制什么。)
说实话,我还不理解 GUI 和plot foo 的概念。失踪的 Canvas 被其养育人物覆盖。我真的不明白。当有一个图形时,什么可以处理多个图,每个图不应该有自己的 Canvas 吗?
但我认为,问题就在这里。
非常感谢。
关于python - 如何更新事件驱动的情节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34622537/