English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Metodo per implementare l'effetto animato della pioggia con Matplotlib in Python

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.

Ti potrebbe interessare