使用matplotlib实时更新图表

2nbm6dog  于 2023-02-23  发布在  其他
关注(0)|答案(1)|浏览(257)

我想通过实时重绘新曲线(100个点)来更新绘图。
这是可行的:

import time, matplotlib.pyplot as plt, numpy as np
fig = plt.figure()
ax = fig.add_subplot(111)
t0 = time.time()
for i in range(10000000):
    x = np.random.random(100)
    ax.clear()
    ax.plot(x, color='b')
    fig.show()
    plt.pause(0.01)
    print(i, i/(time.time()-t0))

但是只有~10 fps,看起来很慢。
在Matplotlib中执行此操作的标准方法是什么?
我已经阅读了How to update a plot in matplotlibHow do I plot in real-time in a while loop using matplotlib?,但是这两种情况是不同的,因为它们 * 在现有绘图中添加了一个新点 *。在我的用例中,我需要重新绘制所有内容并保留100个点。

mkshixfv

mkshixfv1#

我不知道有什么技术可以提高一个数量级。不过,你可以稍微增加FPS与
1.更新线数据,而不是使用set_ydata(和/或set_xdata)创建新图
1.使用Figure.canvas.draw_idle()代替Figure.canvas.draw()(参见this question)。
因此,我建议您尝试以下方法:

import time
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111)
t0 = time.time()

x = np.random.random(100)
l, *_ = ax.plot(x, color='b')
fig.show()
fig.canvas.flush_events()
ax.set_autoscale_on(False)
for i in range(10000000):
    x = np.random.random(100)
    l.set_ydata(x)
    fig.canvas.draw_idle()
    fig.canvas.flush_events()
    print(i, i/(time.time()-t0))

注意,正如@Bhargav在注解中提到的,更改matplotlib后端也会有所帮助(例如matplotlib.use('QtAgg'))。
希望这能有所帮助。

相关问题