English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Questo articolo illustra il metodo di implementazione dell'effetto animazione delle gocce di pioggia utilizzando Matplotlib in Python. Lo condivido con tutti per riferimento, come segue:
Punti chiave
Installazione di ffmpeg su win10
Utilizzo della funzione animation
Funzione update
Installazione di ffmpeg su win10
Poiché alla fine dobbiamo salvare l'animazione in formato .mp4, è necessario usare ffmpeg, scaricarlo dal sito ufficiale, ho scaricato la versione statica per Windows 64bit, dopo averlo scaricato, ho estratto nella directory di installazione comune del software e ho aggiunto il percorso di ffmpeg alle variabili di ambiente (questo metodo non è stato utilizzato alla fine, ma è stato aggiunto lo stesso)
Funzione animationa
In realtà è la funzione animation.FuncAnimation
Parametri comuni:
animation.FuncAnimation(fig, func, frames, init_func, interval)
fig: matplotlib.figure.Figure
func: Ogni frame viene chiamata questa funzione, il primo argomento della funzione è il valore successivo nell'iterabile frames
frames: iterable, può essere un intero, se è un intero, è equivalente a passare range(frames)
init_func: Funzione di inizializzazione, che è la configurazione iniziale di fig
interval: Intervallo tra i frame in millisecondi. Predefinito a 200.
Funzione update
Questa funzione riguarda le variazioni dei parametri grafici in ogni frame, come le dimensioni delle gocce, i colori, le posizioni ecc. (disegno di punti sparsi scatter), vedere il codice per dettagli.
Implementazione del programma
All'inizio ho trovato un esempio di routine basato su BSD, dopo alcune mie modifiche, quindi ho anche aggiunto il protocollo nella mia codice.
# ----------------------------------------------------------------------------- # Copyright (c) 2015, Nicolas P. Rougier. Tutti i diritti riservati. # Distribuito sotto la (nuova) Licenza BSD. Vedi LICENSE.txt per ulteriori informazioni. # ----------------------------------------------------------------------------- import numpy as np import matplotlib import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from matplotlib import animation import os # Determina la posizione di ffmpeg.exe, ho provato ad aggiungerlo alle variabili d'ambiente ma continuava a dare l'errore di non trovare MovieWriter, alla fine questo metodo ha risolto il problema, nella versione Python 2.7 è necessario dichiarare l'encoding come unicode davanti al nome del percorso, mentre in Python 3 non è necessario, questa è una differenza di encoding tra le versioni 2.x e 3.x plt.rcParams['animation.ffmpeg_path'] = u"D:\\Applications\\ffmpeg-20170503-a75ef15-win64-static\\bin\\ffmpeg.exe" # Qui si cambia la directory di lavoro corrente, per facilitare il salvataggio automatico dei file in questa directory os.chdir("d:\\Files\\python\\matplotlib") # Nessuna barra degli strumenti matplotlib.rcParams['toolbar'] = 'None' # Nuova figura con sfondo bianco fig = plt.figure(figsize=(6, 6), facecolor='white') # Nuovo asse attraverso l'intera figura e un rapporto di proporzioni 1:1 # ax = fig.add_axes([0, 0, 1, 1], frameon=False, aspect=1) ax = fig.add_axes([0.005, 0.005, 0.990, 0.990], frameon=True, aspect=1) # Numero di anello n = 50 size_min = 50 size_max = 50*50 # Posizione del cerchio, posizione del cerchio, intervallo [0,1] P = np.random.uniform(0,1,(n,2)) # Colori del cerchio C = np.ones((n,4)) * (0,1,0,1) #C = np.ones((n,3)) * (1,0,1) # Il canale di colore alpha va da 0 (trasparente) a 1 (opaco) # Trasparenza, valore tra [0,1] C[:,2] = np.linspace(0,1,n) # Dimensioni del cerchio, range [50,2500] S = np.linspace(size_min, size_max, n) # Scatter plot # Disegno del grafico a dispersione scat = ax.scatter(P[:,0], P[:,1], s=S, lw = 0.5, edgecolors = C, facecolors='None') # Assicura che i limiti siano [0,1] e rimuovi i marchi # Assicura che l'intervallo di x, y sia [0,1] e rimuovi i marchi dell'asse ax.set_xlim(0,1), ax.set_xticks([]) ax.set_ylim(0,1), ax.set_yticks([]) def update(frame): globale P, C, S # Ogni cerchio diventa più trasparente C[:,3] = np.maximum(0, C[:,3] - 1.0/n) # Ogni cerchio diventa più grande S += (size_max - size_min) / n # Azzera il cerchio specifico in relazione al numero di frame i = frame % 50 P[i] = np.random.uniform(0,1,2) # P[i] = P[i,:], cambia contemporaneamente i valori di x e y S[i] = size_min # Inizia con la forma più piccola C[i,3] = 1 # Imposta la trasparenza a 1 #Aggiornare l'oggetto scatter #Aggiornare le proprietà dell'oggetto scatter, ad esempio edgecolors, sizes, offsets ecc. scat.set_edgecolors(C) #Impostare i colori degli spigoli scat.set_sizes(S) #Impostare le dimensioni scat.set_offsets(P) #Impostare il posizionamento return scat, animate = FuncAnimation(fig, update, frames = 300,interval=70)#interval è ogni 70 millisecondi di aggiornamento, puoi vedere help FFwriter = animation.FFMpegWriter(fps=20) #frame per second, fotogrammi al secondo animate.save('rain.mp4', writer=FFwriter,dpi=360)#Impostare la risoluzione plt.show()
Il file generato è in formato mp4, l'ho trasformato in un file gif molto piccolo per vedere l'effetto, ma sembra che il formato gif non funzioni bene.
Chi è interessato a ulteriori contenuti su Python può consultare le sezioni speciali di questo sito: 'Guida a Strutture Dati e Algoritmi Python', 'Riassunto delle tecniche di utilizzo delle funzioni Python', 'Riassunto delle tecniche di manipolazione delle stringhe Python', 'Guida classica di introduzione e avanzamento Python' e 'Riassunto delle tecniche di manipolazione dei file e delle directory Python'.
Spero che il contenuto di questo articolo possa essere utile per la progettazione di programmi Python di tutti.
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright spetta ai rispettivi autori, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene i diritti di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale. Se trovi contenuti sospetti di violazione del copyright, invia un'e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.