सबसे पहले, (हालांकि यह प्रदर्शन बिल्कुल भी नहीं बदलेगा) अपने कोड, इस के समान को साफ करने पर विचार करें: ऊपर के उदाहरण के साथ
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)
, मैं 10fps के आसपास मिलता है।
आपके सटीक उपयोग के मामले के आधार पर बस एक त्वरित नोट, matplotlib एक अच्छा विकल्प नहीं हो सकता है। यह प्रकाशन-गुणवत्ता वाले आंकड़ों की ओर उन्मुख है, वास्तविक समय के प्रदर्शन नहीं।
हालांकि, इस उदाहरण को गति देने के लिए आप बहुत सी चीजें कर सकते हैं।
दो मुख्य कारण हैं कि यह जितना धीमा है।
1) fig.canvas.draw()
कॉलिंग सब कुछ पर कॉल करना। यह तुम्हारी बाधा है। आपके मामले में, आपको अक्ष की सीमाओं, टिक टिक, इत्यादि जैसी चीजों को फिर से खींचने की आवश्यकता नहीं है
2) आपके मामले में, बहुत सारे टिक लेबल वाले बहुत सारे सबप्लॉट हैं। इन्हें आकर्षित करने में काफी समय लगता है।
इन दोनों को ब्लिटिंग का उपयोग करके ठीक किया जा सकता है।
कुशलतापूर्वक मिश्रण करने के लिए, आपको बैकएंड-विशिष्ट कोड का उपयोग करना होगा। व्यावहारिक रूप से, यदि आप चिकनी एनिमेशन के बारे में वास्तव में चिंतित हैं, तो आप आमतौर पर कुछ प्रकार के गुई टूलकिट में matplotlib प्लॉट एम्बेड कर रहे हैं, इसलिए यह कोई समस्या नहीं है।
हालांकि, आप जो भी कर रहे हैं उसके बारे में कुछ और जानने के बिना, मैं आपकी मदद नहीं कर सकता।
फिर भी, ऐसा करने का एक गुई-तटस्थ तरीका है जो अभी भी काफी तेज़ है।
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)
यह मुझे ~ 200fps देता है।
इसे थोड़ा और सुविधाजनक बनाने के लिए, matplotlib के हाल के संस्करणों में animations
मॉड्यूल है।
एक उदाहरण के रूप:
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()
निम्नलिखित प्रासंगिक हो सकते हैं: http://stackoverflow.com/questions/5003094/how-can-i-speed-up-an-animation – NPE
@aix - ग्लेम्पी ने केवल उस उदाहरण में मदद की क्योंकि वह तेजी से प्रदर्शित छवि से निपट रहा था डेटा। यह इस मामले में मदद नहीं करेगा। –
बैकएंड को बदलने का प्रयास करें। मेरा उत्तर देखें: http://stackoverflow.com/a/30655528/2066079। या बैकएंड के बारे में यह FAQ: http://matplotlib.org/faq/usage_faq.html#what-is-a-backend – dberm22