Matplotlib 3.0

animation




matplotlib

animation

विषय - सूची

एनीमेशन

Matplotlib में लाइव एनीमेशन बनाने का सबसे आसान तरीका है कि आप Animation कक्षाओं में से किसी एक का उपयोग करें।

FuncAnimation किसी फंक्शन को बार-बार कॉल करके एक एनीमेशन बनाता है।
ArtistAnimation Artist वस्तुओं के एक निश्चित सेट का उपयोग करके एनीमेशन।

दोनों मामलों में उदाहरण वस्तु का संदर्भ रखना महत्वपूर्ण है। एनीमेशन एक टाइमर (आमतौर पर मेजबान जीयूआई फ्रेमवर्क से) द्वारा उन्नत है, जिसे Animation ऑब्जेक्ट एकमात्र संदर्भ रखता है। यदि आप Animation ऑब्जेक्ट का संदर्भ नहीं रखते हैं, तो यह (और इसलिए टाइमर), कचरा एकत्र किया जाएगा जो एनीमेशन को रोक देगा।

एनीमेशन को डिस्क पर सहेजने के लिए Animation.save उपयोग करें। Animation.save या Animation.to_html5_video

फिल्म प्रारूप क्या समर्थित हैं, इस बारे में जानकारी के लिए नीचे हेल्पर कक्षाएं देखें

FuncAnimation

FuncAnimation आंतरिक कामकाज अधिक या कम हैं:

for d in frames:
   artists = func(d, *fargs)
   fig.canvas.draw_idle()
   fig.canvas.start_event_loop(interval)

'ब्लटिंग' को संभालने के लिए विवरण के साथ (लाइव प्रदर्शन में नाटकीय रूप से सुधार करने के लिए), गैर-अवरोधक होने के लिए, जीयूआई इवेंट लूप को बार-बार शुरू / बंद न करें, दोहराए जाने, कई एनिमेटेड कुल्हाड़ियों को संभालें, और आसानी से एनीमेशन को एक फिल्म फ़ाइल में सहेजें।

'ब्लॉटिंग' कंप्यूटर ग्राफिक्स में एक पुरानी तकनीक है। सामान्य जिस्ट को एक मौजूदा बिट मैप (हमारे मामले में ज्यादातर विचित्र आंकड़ा) लेना है और फिर शीर्ष पर एक और कलाकार को 'ब्लिट' करना है। इस प्रकार, एक सहेजे गए 'क्लीन' बिटमैप को प्रबंधित करके, हम केवल कुछ कलाकारों को फिर से आकर्षित कर सकते हैं जो प्रत्येक फ्रेम पर बदल रहे हैं और संभवतः महत्वपूर्ण मात्रा में समय बचा सकते हैं। जब हम FuncAnimation blit=True पास करके) का उपयोग करते हैं, तो FuncAnimation का कोर लूप थोड़ा और अधिक जटिल हो जाता है:

ax = fig.gca()

def update_blit(artists):
    fig.canvas.restore_region(bg_cache)
    for a in artists:
        a.axes.draw_artist(a)

    ax.figure.canvas.blit(ax.bbox)

artists = init_func()

for a in artists:
   a.set_animated(True)

fig.canvas.draw()
bg_cache = fig.canvas.copy_from_bbox(ax.bbox)

for f in frames:
    artists = func(f, *fargs)
    update_blit(artists)
    fig.canvas.start_event_loop(interval)

यह निश्चित रूप से कई विवरणों को छोड़ रहा है (जैसे कि आकृति को अपडेट करने पर पृष्ठभूमि को अपडेट करना या पूरी तरह से फिर से तैयार करना)। हालाँकि, यह init_func न्यूनतम उदाहरण इस बात का अहसास init_func कि init_func अंदर init_func और func का उपयोग कैसे किया जाता है और ' FuncAnimation ' कैसे काम करता है, इसके सिद्धांत का उपयोग किया जाता है।

init_func और init_func पर अपेक्षित हस्ताक्षर FuncAnimation को आपकी पुस्तक को रखने और तर्क- FuncAnimation बाहर रखने के लिए बहुत सरल है, लेकिन इसका मतलब यह है कि आपके द्वारा पास की जाने वाली FuncAnimation करने योग्य वस्तुओं को पता होना चाहिए कि उन्हें किन कलाकारों पर काम करना चाहिए। इसे संभालने के लिए कई दृष्टिकोण हैं, अलग-अलग जटिलता और इनकैप्सुलेशन। सबसे सरल दृष्टिकोण, जो एक स्क्रिप्ट के मामले में काफी अच्छा काम करता है, वह है कलाकार को वैश्विक दायरे में परिभाषित करना और पायथन चीजों को बाहर करने देना। उदाहरण के लिए

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.plot([], [], 'ro', animated=True)

def init():
    ax.set_xlim(0, 2*np.pi)
    ax.set_ylim(-1, 1)
    return ln,

def update(frame):
    xdata.append(frame)
    ydata.append(np.sin(frame))
    ln.set_data(xdata, ydata)
    return ln,

ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
                    init_func=init, blit=True)
plt.show()

दूसरी विधि हमारे लिए कार्य करने के लिए कलाकारों को 'बाइंड' करने के लिए functools.partial है। एक तीसरी विधि आवश्यक कलाकारों और कार्यों को बनाने के लिए क्लोजर का उपयोग करना है। एक चौथी विधि एक वर्ग बनाने के लिए है।

उदाहरण

ArtistAnimation

उदाहरण

लेखक वर्ग

प्रदान किए गए लेखक कुछ व्यापक श्रेणियों में आते हैं।

पिलो लेखक सभी डेटा को स्मृति में रखते हुए, पिलो लाइब्रेरी पर निर्भर करता है।

PillowWriter

पाइप-आधारित लेखक एक बाहरी प्रक्रिया में एक पाइप पर कैप्चर किए गए फ़्रेमों को प्रवाहित करते हैं। पाइप-आधारित वैरिएंट अधिक प्रदर्शन करने वाले होते हैं, लेकिन सभी प्रणालियों पर काम नहीं कर सकते हैं।

FFMpegWriter पाइप-आधारित ffmpeg लेखक।
ImageMagickWriter पाइप-आधारित एनिमेटेड जिफ।
AVConvWriter पाइप-आधारित एवोकॉन लेखक।

फ़ाइल-आधारित लेखक प्रत्येक फ़्रेम के लिए अस्थायी फ़ाइलों को सहेजते हैं जो अंत में एक एकल फ़ाइल में सिले होते हैं। हालांकि धीमा, इन लेखकों को डिबग करना आसान हो सकता है।

FFMpegFileWriter फ़ाइल-आधारित ffmpeg लेखक।
ImageMagickFileWriter फ़ाइल-आधारित एनिमेटेड जिफ लेखक।
AVConvFileWriter फ़ाइल-आधारित एवोकॉन लेखक।

मौलिक रूप से, एक MovieWriter उसी अंतर्निहित Figure वस्तु से अनुक्रमिक फ्रेम को हथियाने का एक तरीका प्रदान करता है। बेस क्लास MovieWriter 3 विधियों और एक संदर्भ प्रबंधक को लागू करता है। पाइप-आधारित और फ़ाइल-आधारित लेखकों के बीच एकमात्र अंतर उनके संबंधित setup विधियों के तर्क में है।

setup() विधि का उपयोग लेखक को तैयार करने के लिए किया जाता है (संभवतः एक पाइप खोलते हुए), एक समय में एक ही फ्रेम पर कब्जा करने के लिए grab_frame() को कॉल करता है और finish() मूवी को अंतिम रूप देता है और आउटपुट फाइल को डिस्क पर लिखता है। उदाहरण के लिए

moviewriter = MovieWriter(...)
moviewriter.setup(fig=fig, 'my_movie.ext', dpi=100)
for j in range(n):
    update_figure(n)
    moviewriter.grab_frame()
moviewriter.finish()

यदि लेखक कक्षाओं का सीधे उपयोग कर रहा है ( Animation.save माध्यम से नहीं) तो, यह saving संदर्भ प्रबंधक का उपयोग करने के लिए दृढ़ता से प्रोत्साहित किया जाता है

with moviewriter.saving(fig, 'myfile.mp4', dpi=100):
    for j in range(n):
        update_figure(n)
        moviewriter.grab_frame()

यह सुनिश्चित करने के लिए कि सेटअप और क्लीनअप आवश्यक रूप से किए गए हैं।

उदाहरण

हेल्पर क्लासेस

एनिमेशन बेस क्लासेस

Animation यह वर्ग matplotlib का उपयोग करके एक एनीमेशन के निर्माण को लपेटता है।
TimedAnimation समय-आधारित एनीमेशन के लिए Animation उपवर्ग।

लेखक रजिस्ट्री

एक मॉड्यूल-स्तर की रजिस्ट्री को लेखक और वर्ग के नाम के बीच मैप करने के लिए प्रदान किया जाता है ताकि एक लेखक उदाहरण के बजाय एक स्ट्रिंग को Animation.save भेजा जा सके।

MovieWriterRegistry मानव पठनीय नाम से उपलब्ध लेखक कक्षाओं की रजिस्ट्री।

लेखक बेस क्लासेस

कोड दोहराव आधार वर्गों को कम करने के लिए

AbstractMovieWriter फिल्में लिखने के लिए सार आधार वर्ग।
MovieWriter फिल्में लिखने के लिए बेस क्लास।
FileMovieWriter अलग-अलग फ़ाइलों को लिखने और अंत में सिलाई के लिए MovieWriter

और मिश्रण

AVConvBase एवोकॉन आउटपुट के लिए मिक्सिन वर्ग।
FFMpegBase FFMpeg आउटपुट के लिए मिक्सिन वर्ग।
ImageMagickBase ImageMagick आउटपुट के लिए मिक्सिन वर्ग।

दिए गए है।

नए MovieWriter वर्गों को आसानी से लागू करने के लिए स्रोत कोड देखें।

वंशानुक्रम आरेख

Matplotlib.animation के एकीकरण आरेख ।uncAnimation, matplotlib.animation.ArtistAnimation Matplotlib.animation.AVConvFileWriter, matplotlib.animation.AVConvWriter, matplotlib.animation.FMpegFrWriter, matplotlib.animation.nic.info।