Trước hết, (mặc dù điều này sẽ không thay đổi việc thực hiện tại tất cả) xem xét việc dọn dẹp mã của bạn, tương tự như sau:
import matplotlib.pyplot as plt
import numpy as np
import time
x = np.arange(0, 2*np.pi, 0.01)
y = np.sin(x)
fig, axes = plt.subplots(nrows=6)
styles = ['r-', 'g-', 'y-', 'm-', 'k-', 'c-']
lines = [ax.plot(x, y, style)[0] for ax, style in zip(axes, styles)]
fig.show()
tstart = time.time()
for i in xrange(1, 20):
for j, line in enumerate(lines, start=1):
line.set_ydata(np.sin(j*x + i/10.0))
fig.canvas.draw()
print 'FPS:' , 20/(time.time()-tstart)
Với ví dụ trên, tôi nhận được khoảng 10fps.
Chỉ cần lưu ý nhanh, tùy thuộc vào trường hợp sử dụng chính xác của bạn, matplotlib có thể không phải là lựa chọn tuyệt vời. Nó hướng tới các con số chất lượng xuất bản, chứ không phải hiển thị thời gian thực.
Tuy nhiên, có rất nhiều việc bạn có thể làm để tăng tốc ví dụ này.
Có hai lý do chính tại sao điều này chậm như hiện tại.
1) Gọi fig.canvas.draw()
vẽ lại mọi thứ. Đó là nút cổ chai của bạn. Trong trường hợp của bạn, bạn không cần phải vẽ lại những thứ như ranh giới rìu, đánh dấu nhãn, v.v.
2) Trong trường hợp của bạn, có rất nhiều điểm con có nhiều nhãn đánh dấu. Chúng mất một thời gian dài để vẽ.
Cả hai điều này có thể được khắc phục bằng cách sử dụng tính năng nhòe.
Để thực hiện đánh dấu hiệu quả, bạn sẽ phải sử dụng mã phụ trợ cụ thể. Trong thực tế, nếu bạn đang thực sự lo lắng về hình ảnh động trơn tru, bạn thường nhúng matplotlib lô trong một số loại bộ công cụ gui, anyway, vì vậy đây không phải là một vấn đề.
Tuy nhiên, không biết nhiều hơn về những gì bạn đang làm, tôi không thể giúp bạn ở đó.
Tuy nhiên, có một cách gui-trung lập để làm điều đó vẫn còn khá nhanh.
import matplotlib.pyplot as plt
import numpy as np
import time
x = np.arange(0, 2*np.pi, 0.1)
y = np.sin(x)
fig, axes = plt.subplots(nrows=6)
fig.show()
# We need to draw the canvas before we start animating...
fig.canvas.draw()
styles = ['r-', 'g-', 'y-', 'm-', 'k-', 'c-']
def plot(ax, style):
return ax.plot(x, y, style, animated=True)[0]
lines = [plot(ax, style) for ax, style in zip(axes, styles)]
# Let's capture the background of the figure
backgrounds = [fig.canvas.copy_from_bbox(ax.bbox) for ax in axes]
tstart = time.time()
for i in xrange(1, 2000):
items = enumerate(zip(lines, axes, backgrounds), start=1)
for j, (line, ax, background) in items:
fig.canvas.restore_region(background)
line.set_ydata(np.sin(j*x + i/10.0))
ax.draw_artist(line)
fig.canvas.blit(ax.bbox)
print 'FPS:' , 2000/(time.time()-tstart)
Điều này mang lại cho tôi ~ 200 khung hình/giây.
Để làm điều này thuận tiện hơn một chút, có mô-đun animations
trong các phiên bản gần đây của matplotlib.
Như một ví dụ:
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
x = np.arange(0, 2*np.pi, 0.1)
y = np.sin(x)
fig, axes = plt.subplots(nrows=6)
styles = ['r-', 'g-', 'y-', 'm-', 'k-', 'c-']
def plot(ax, style):
return ax.plot(x, y, style, animated=True)[0]
lines = [plot(ax, style) for ax, style in zip(axes, styles)]
def animate(i):
for j, line in enumerate(lines, start=1):
line.set_ydata(np.sin(j*x + i/10.0))
return lines
# We'd normally specify a reasonable "interval" here...
ani = animation.FuncAnimation(fig, animate, xrange(1, 200),
interval=0, blit=True)
plt.show()
Sau đây có thể có liên quan: http://stackoverflow.com/questions/5003094/how-can-i-speed-up-an-animation – NPE
@aix - Glumpy chỉ giúp trong ví dụ đó bởi vì anh ta đang xử lý hình ảnh hiển thị nhanh chóng dữ liệu. Nó sẽ không giúp đỡ trong trường hợp này. –
Thử thay đổi chương trình phụ trợ. Xem câu trả lời của tôi: http://stackoverflow.com/a/30655528/2066079. hoặc Câu hỏi thường gặp này về các chương trình phụ trợ: http://matplotlib.org/faq/usage_faq.html#what-is-a-backend – dberm22