Öncelikle, (bu performansı hiç değiştirmeyecek olsa da) şuna benzer şekilde kodunuzu temizlemeyi düşünün:
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)
Yukarıdaki örnekle yaklaşık 10 fps elde ediyorum.
Kısa bir not, tam kullanım durumunuza bağlı olarak, matplotlib harika bir seçim olmayabilir. Gerçek zamanlı görüntülemeye değil, yayın kalitesinde rakamlara yöneliktir.
Ancak, bu örneği hızlandırmak için yapabileceğiniz birçok şey var.
Bunun bu kadar yavaş olmasının iki ana nedeni var.
1) Çağrı her şeyifig.canvas.draw()
yeniden çizer . Bu senin darboğazın. Sizin durumunuzda, eksen sınırları, işaret etiketleri vb. Gibi şeyleri yeniden çizmenize gerek yoktur.
2) Sizin durumunuzda, çok sayıda işaret etiketi olan çok sayıda alt nokta vardır. Bunları çizmek uzun zaman alıyor.
Her ikisi de blitting kullanılarak düzeltilebilir.
Verimli bir şekilde blitting yapmak için arka uca özel kod kullanmanız gerekir. Pratikte, pürüzsüz animasyonlar konusunda gerçekten endişeleniyorsanız, genellikle matplotlib grafiklerini bir çeşit gui araç setine yerleştiriyorsunuzdur, bu yüzden bu bir sorun değil.
Ancak, ne yaptığınız hakkında biraz daha fazla bilgi sahibi olmadan size yardımcı olamam.
Yine de, bunu yapmanın hala makul derecede hızlı olan, gui-nötr bir yolu var.
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()
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)]
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)
Bu bana ~ 200 fps veriyor.
Bunu biraz daha kullanışlı hale getirmek için animations
matplotlib'in son sürümlerinde bir modül var .
Örnek olarak:
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
ani = animation.FuncAnimation(fig, animate, xrange(1, 200),
interval=0, blit=True)
plt.show()