logo

Grafritning i Python | Set 3

Grafritning i Python | Set 1 Grafritning i Python | Set 2 Matplotlib är ett ganska omfattande bibliotek som stöder Animationer av grafer också. Animationsverktygen är centrerade kring matplotlib.animation basklass som tillhandahåller ett ramverk kring vilket animeringsfunktionaliteten är uppbyggd. Huvudgränssnitten är Timed Animation och FuncAnimation och av de två FuncAnimation är den mest bekväma att använda. Installation:
    Matplotlib: Se Grafritning i Python | Set 1 Numpy: You can install numpy module using following pip command:
    pip install numpy
    FFMPEG: Det krävs bara för att spara animationen som en video. Den körbara filen kan laddas ner från här .
Genomförande: Python
# importing required modules import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np # create a figure axis and plot element fig = plt.figure() ax = plt.axes(xlim=(-50 50) ylim=(-50 50)) line = ax.plot([] [] lw=2) # initialization function def init(): # creating an empty plot/frame line.set_data([] []) return line # lists to store x and y axis points xdata ydata = [] [] # animation function def animate(i): # t is a parameter t = 0.1*i # x y values to be plotted x = t*np.sin(t) y = t*np.cos(t) # appending new points to x y axes points list xdata.append(x) ydata.append(y) # set/update the x and y axes data line.set_data(xdata ydata) # return line object return line # setting a title for the plot plt.title('A growing coil!') # hiding the axis details plt.axis('off') # call the animator  anim = animation.FuncAnimation(fig animate init_func=init frames=500 interval=20 blit=True) # save the animation as mp4 video file anim.save('animated_coil.mp4' writer = 'ffmpeg' fps = 30) # show the plot plt.show() 
Here is how the output animation looks like: Now let us try to understand the code in pieces:
  • fig = plt.figure() ax = plt.axes(xlim=(-50 50) ylim=(-50 50)) line = ax.plot([] [] lw=2)
    Here we first create a figure i.e a top level container for all our subplots. Then we create an axes element yxa som fungerar som en subplot. Avståndet/gränsen för x- och y-axeln definieras också när axelelementet skapas. Slutligen skapar vi tomt element som heter som linje . Inledningsvis har x- och y-axelpunkterna definierats som tomma listor och linjebredd (lw) har satts till 2.
  • def init(): line.set_data([] []) return line
    Now we declare a initialization function värme . Denna funktion anropas av animatören för att skapa den första bildrutan.
  • def animate(i): # t is a parameter t = 0.1*i # x y values to be plotted x = t*np.sin(t) y = t*np.cos(t) # appending new points to x y axes points list xdata.append(x) ydata.append(y) # set/update the x and y axes data line.set_data(xdata ydata) # return line object return line
    This is the most important function of above program. animera() funktionen anropas om och om igen av animatören för att skapa varje bildruta. Antalet gånger denna funktion kommer att anropas bestäms av antalet ramar som skickas som ramar argument till animatör. animera() function takes the index of ith frame as argument.
    t = 0.1*i
    Here we cleverly use the index of current frame as a parameter!
    x = t*np.sin(t) y = t*np.cos(t)
    Now since we have the parameter t we can easily plot any parametric equation. For example here we are plotting a spiral using its parametric equation.
    line.set_data(xdata ydata) return line
    Finally we use set_data() funktion för att ställa in x- och y-data och sedan returnera plotobjekt linje .
  • anim = animation.FuncAnimation(fig animate init_func=init frames=500 interval=20 blit=True)
    Now we create the FuncAnimation object sex . Det kräver olika argument som förklaras nedan: fikon : figur som ska ritas. animera : funktionen som ska anropas upprepade gånger för varje bildruta . init_func : funktion som används för att rita en tydlig ram. Det kallas en gång före den första bilden. ramar : antal ramar. (Notera: ramar kan också vara en iterabel eller generator.) intervall : varaktighet mellan bildrutor (i millisekunder) vistelse : setting blit=True betyder att endast de delar som har ändrats kommer att ritas.
  • anim.save('animated_coil.mp4' writer = 'ffmpeg' fps = 30)
    Now we save the animator object as a video file using spara() fungera. Du behöver en filmskribent för att spara animationsvideon. I det här exemplet har vi använt FFMPEG-filmförfattare. Så författare är inställd som 'ffmpeg'. fps står för bildruta per sekund.
Exempel 2 This example shows how one can make a rotating curve by applying some simple mathematics! Python
# importing required modules import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np # create a figure axis and plot element fig = plt.figure() ax = plt.axes(xlim=(-25 25) ylim=(-25 25)) line = ax.plot([] [] lw=2) # initialization function def init(): # creating an empty plot/frame line.set_data([] []) return line # set of points for a star (could be any curve) p = np.arange(0 4*np.pi 0.1) x = 12*np.cos(p) + 8*np.cos(1.5*p) y = 12*np.sin(p) - 8*np.sin(1.5*p) # animation function def animate(i): # t is a parameter t = 0.1*i # x y values to be plotted X = x*np.cos(t) - y*np.sin(t) Y = y*np.cos(t) + x*np.sin(t) # set/update the x and y axes data line.set_data(X Y) # return line object return line # setting a title for the plot plt.title('A rotating star!') # hiding the axis details plt.axis('off') # call the animator  anim = animation.FuncAnimation(fig animate init_func=init frames=100 interval=100 blit=True) # save the animation as mp4 video file anim.save('basic_animation.mp4' writer = 'ffmpeg' fps = 10) # show the plot plt.show() 
Here is how the output of above program looks like: Here we have used some simple mathematics to rotate a given curve.
  • Stjärnformen erhålls genom att sätta k = 2,5 och 0p = np.arange(0 4*np.pi 0.1) x = 12*np.cos(p) + 8*np.cos(1.5*p) y = 12*np.sin(p) - 8*np.sin(1.5*p)
  • Now in each frame we rotate the star curve using concept of rotation in complex numbers. Let x y be two ordinates. Then after rotation by angle theta the new ordinates are: {x}' = xcos theta - ysin theta {y}' = xsin theta + ycos theta The same has been applied here:
    X = x*np.cos(t) - y*np.sin(t) Y = y*np.cos(t) + x*np.sin(t)
Allt som allt är animationer ett bra verktyg för att skapa fantastiska saker och många fler saker kan skapas med hjälp av dem. Så det var så här animerade plotter kan genereras och sparas med Matplotlib. Skapa frågesport