প্রথমে, (যদিও এটি কিছুতেই পারফরম্যান্স পরিবর্তন করবে না) আপনার কোড সাফ করার বিষয়টি বিবেচনা করুন, এর অনুরূপ:
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 পেতে।
আপনার সঠিক ব্যবহারের ক্ষেত্রে নির্ভর করে কেবল একটি দ্রষ্টব্য নোট, ম্যাটপ্ল্লোলিব দুর্দান্ত পছন্দ নাও হতে পারে। এটি রিয়েল-টাইম প্রদর্শন নয়, প্রকাশনার-মানের পরিসংখ্যানগুলির দিকে ভিত্তি করে।
তবে এই উদাহরণটি গতিময় করতে আপনি অনেক কিছুই করতে পারেন।
এটি যতটা ধীর হয় তার দুটি প্রধান কারণ রয়েছে।
1) কলিং সবকিছুfig.canvas.draw()
redraws । এটা তোমার বাধা। আপনার ক্ষেত্রে, আপনাকে অক্ষগুলির সীমানা, টিক লেবেল ইত্যাদির মতো জিনিসগুলি আবার আঁকার দরকার নেই
2) আপনার ক্ষেত্রে, প্রচুর টিক লেবেল সহ প্রচুর সাবপ্লট রয়েছে। এগুলি আঁকতে দীর্ঘ সময় নেয়।
এই উভয় blitting ব্যবহার করে স্থির করা যেতে পারে।
দক্ষতার সাথে ব্লিটিং করতে, আপনাকে ব্যাকএন্ড-নির্দিষ্ট কোড ব্যবহার করতে হবে। অনুশীলনে, আপনি যদি মসৃণ অ্যানিমেশনগুলি সম্পর্কে সত্যই উদ্বিগ্ন থাকেন তবে আপনি সাধারণত কোনওভাবেই কিছুটা গুই টুলকিটের ম্যাটপ্ল্লিটিব প্লট এম্বেড করছেন, সুতরাং এটি কোনও সমস্যা নয়।
তবে আপনি কী করছেন সে সম্পর্কে কিছুটা না জেনে আমি আপনাকে সেখানে সহায়তা করতে পারি না।
তবুও, এটি করার একটি গুই-নিরপেক্ষ উপায় রয়েছে যা এখনও যুক্তিসঙ্গতভাবে দ্রুত।
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)
এটি আমাকে 200fps দেয়।
এটিকে কিছুটা সুবিধাজনক করার জন্য 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
ani = animation.FuncAnimation(fig, animate, xrange(1, 200),
interval=0, blit=True)
plt.show()