我想知道为什么当我使用matplotlib绘制线条时会非常慢?如何解决?
Belows是演示代码。它使用plot()
在两个随机生成的点之间绘制一条线。
在我的电脑上,' END = 100/200/500'结果' FPS = 36.9 / 28.6 / 20'。我需要无尽的画线,而且时间会变得更糟。怎么解决? 谢谢!
import numpy as np
import matplotlib.pyplot as plt
import time
def draw_demo():
x = 100
plt.axis([0, x, 0, 1])
plt.ion()
last = 50
TIME = 5
END = 1000
time_start = time.time()
for i in range(0, END):
random_num = np.random.random()
if i > 70:
plt.axis([x - 100, x + 1, 0, 1])
x += 1
plt.plot([i, i + 1], [last, random_num])
last = random_num
plt.pause(0.0001)
print ('FPS:', END/(time.time()-time_start))
raw_input()
if __name__ == '__main__':
draw_demo()
答案 0 :(得分:2)
尝试类似:
import numpy as np
import matplotlib.pyplot as plt
import time
def draw_demo2(ax):
x = 100
ax.set_xlim([x-100, x + 250])
ax.set_ylim([0, 1])
END = 250
time_start = time.time()
ln, = ax.plot([], [])
x_data = []
y_data = []
for i in range(0, END):
random_num = np.random.random()
if i%100 == 99:
cur_xlim = ax.get_xlim()
ax.set_xlim(np.array(cur_xlim) + 100)
x += 1
x_data.append(x)
y_data.append(random_num)
ln.set_data(x_data, y_data)
ax.figure.canvas.draw_idle()
ax.figure.canvas.flush_events()
print ('FPS:', END/(time.time()-time_start))
if __name__ == '__main__':
draw_demo()
将x和y数据缓冲区截断到视图范围可能是值得的(因为每次绘制屏幕时列表都会转换为数组。
如果您需要快速查看blitting,但是这与更改限制不能很好地相互作用,重新绘制文本是绘制图形的最慢部分之一。
同时尝试qt而不是tk,我看到这个变化加速了4倍。
答案 1 :(得分:0)
matplotlib随着脚本的进展而变得越来越慢,因为它正在重新绘制您之前绘制的所有行 - 甚至是已经滚动屏幕的行。