redraw_figure
函数,它可以在代码运行时“实时”更新图形,并在我停在断点处时显示最新的绘图。以下是一些演示代码:import time
from matplotlib import pyplot as plt
import numpy as np
def live_update_demo():
plt.subplot(2, 1, 1)
h1 = plt.imshow(np.random.randn(30, 30))
redraw_figure()
plt.subplot(2, 1, 2)
h2, = plt.plot(np.random.randn(50))
redraw_figure()
t_start = time.time()
for i in xrange(1000):
h1.set_data(np.random.randn(30, 30))
redraw_figure()
h2.set_ydata(np.random.randn(50))
redraw_figure()
print 'Mean Frame Rate: %.3gFPS' % ((i+1) / (time.time() - t_start))
def redraw_figure():
plt.draw()
plt.pause(0.00001)
live_update_demo()
在运行代码时应实时更新绘图,并在停止在任何redraw_figure()
断点时查看最新数据。问题是如何最好地实现redraw_figure()
在上面的实现中(plt.draw(); plt.pause(0.00001)
),它可以工作,但速度非常慢(约3.7FPS)
我可以这样实现:
def redraw_figure():
plt.gcf().canvas.flush_events()
plt.show(block=False)
它运行得更快(约11FPS),但是当您停在断点处时,绘图不会更新(例如,如果我在t_start = ...
这一行上设置断点,则第二个绘图不会出现)。
奇怪的是,实际上起作用的是调用两次show:
def redraw_figure():
plt.gcf().canvas.flush_events()
plt.show(block=False)
plt.show(block=False)
如果你在任何一行断点上打开,它能提供大约11FPS并保持图表最新。
现在我听说“block”关键字已经被弃用了。而且调用相同的函数两次似乎是一种奇怪的、可能不可移植的方法。
那么,在这个函数中我可以放什么来以合理的帧率绘制图表,而不是一个巨大的笨拙的解决方案,并且最好能够在后端和系统间工作?
- 我使用的是
TkAgg
后端,但欢迎在任何后端/系统上提供解决方案。 - 交互模式“开”不起作用,因为它不会实时更新。只有在Python控制台中等待用户输入时才会更新。
- 一个博客建议使用以下实现:
def redraw_figure(): fig = plt.gcf() fig.canvas.draw() fig.canvas.flush_events()
但至少在我的系统上,这根本没有重新绘制图表。
所以,如果有人有答案,你将直接让我和千千万万人非常高兴。他们的幸福可能会通过他们的朋友和亲戚,以及他们的朋友和亲戚,等等,传递下去,从而您可以潜在地改善数十亿人的生活。
结论
ImportanceOfBeingErnest展示了如何使用blit进行更快的绘图,但这不像是在redraw_figure
函数中放入不同内容那么简单(你需要跟踪重新绘制的东西)。
plt.show(block=False)
,那么绘图大约会以每秒13帧的速度显示出来。 - DavidGfig.canvas.draw_idle()
而不是fig.canvas.draw()
对我有用。 - Nirmalpip install artemis-ml
获取它,并查看函数dbplot
的文档:https://artemis-ml.readthedocs.io/en/latest/plotting.html - Peter