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

Python使用Matplotlib实现雨点图动画效果的方法

Dieser Artikel erläutert die Methode, wie man mit Python und Matplotlib die Animationseffekte von Regentropfenkarten implementiert. Ich teile es mit Ihnen, um Ihnen zur Verfügung zu stellen, genauer gesagt:

Schlüsselpunkte

win10Installieren Sie ffmpeg
Verwendung der animation-Funktion
update-Funktion

win10Installieren Sie ffmpeg

Weil die Animation am Ende als .mp gespeichert werden soll4Format, es wird ffmpeg verwendet, laden Sie es von der Webseite herunter, ich habe von az Windows heruntergeladen64Bit static Version, nach dem Download entpacken Sie sie in den gewöhnlichen Installationspfad des Programms und fügen Sie den Pfad von ffmpeg zu den Umgebungsvariablen hinzu (dieser Weg wird am Ende nicht mehr verwendet, aber es wird noch hinzugefügt)

animationa-Funktion

Genauer gesagt, die Funktion animation.FuncAnimation

Häufig verwendete Parameter:

animation.FuncAnimation(fig,func,frames,init_func,interval)
fig:matplotlib.figure.Figure
func:Jedes Frame wird aufgerufen, der erste Parameter der Funktion ist der Wert im nächsten Parameter frames
frames:iterable, kann ein Integer sein, ein Integer entspricht range(frames)

init_func:Initialisierungsfunction, d.h. die ursprüngliche Einstellung von fig
interval:Verzögerung zwischen den Frames in Millisekunden. Standardmäßig 200.

update-Funktion

Diese Funktion betrifft die Veränderungen der Parameter in den gezeichneten Graphen jedes Frames, wie z.B. die Größe der Regentropfen, die Farbe und die Position im Beispiel (Scatter-Diagramm zeichnen), genauer im Code sehen

program implementation

最初找到了例程的基于BSD协议的,经过一些自己的修改,所以我也在代码中贴上该协议

# -----------------------------------------------------------------------------
# Copyright (c) 2015, Nicolas P. Rougier. All Rights Reserved.
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
# -----------------------------------------------------------------------------
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from matplotlib import animation
import os
# Determine the location of ffmpeg.exe, tried adding it to the environment variables but still提示找不到MovieWriter, finally this method solved it in Python2.7version path name must declare the encoding as unicode in Python3can be omitted, this is2.X and3.x version has a difference in encoding
plt.rcParams['animation.ffmpeg_path'] = u"D:\\Applications\\ffmpeg-20170503-a75ef15-win64-static\\bin\\ffmpeg.exe
# Here, the current working directory is changed to facilitate automatic saving to this path when saving files below
os.chdir("d:\\Files\\python\\matplotlib") 
# No toolbar
matplotlib.rcParams['toolbar'] = 'None'
# New figure with white background
fig = plt.figure(figsize=(6,6), facecolor='white')
# New axis over the whole figure and a 1:1 aspect ratio
# 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)
# Number of ring
n = 50
size_min = 50
size_max = 50*50
# Ring position , die Position der Ringe, im Bereich [0,1] zwischen
P = np.random.uniform(0,1,(n,2))
# Ring colors die Farben der Ringe
C = np.ones((n,4)) * (0,1,0,1)
#C = np.ones((n,3)) * (1,0,1)
# Der Alpha-Farbwertkanal geht von 0 (durchsichtig) bis 1 (durchsichtig)
# Transparency, value between [0,1] zwischen
C[:,2] = np.linspace(0,1,n)
# Ring sizes die Größe der Ringe, im Bereich [50,2500]
S = np.linspace(size_min, size_max, n)
# Streudiagramm
# Scatter plot
scat = ax.scatter(P[:,0], P[:,1], s=S, lw = 0.5,
         edgecolors = C, facecolors='None')
# Ensure limits are [0,1] and remove ticks
# Ensure x,y are within [0,1] zwischen, die Koordinatenachsenmarkierungen werden entfernt
, ax.set_xlim(0,1), ax.set_xticks([])
, ax.set_ylim(0,1), ax.set_yticks([])
def update(frame):
  global P, C, S
  # Every ring is made more transparent jeder Ring wird transparenter
  C[:,3]= np.maximum(0, C[:,3] - 1.0/n)
  # Each ring is made larger jeder Ring wird größer als zuvor
  S += (size_max - size_min) / n
  # Reset ring specific ring (relative to frame number)
  i = frame % 50  
  P[i] = np.random.uniform(0,1,2) # P[i] = P[i,:], gleichzeitig wurden die Werte von x und y geändert
  S[i] = size_min # 从最小的形状开始
  C[i,3] = 1   #Setzen Sie die Transparenz auf1 
  # Aktualisieren Sie das Scatter-Objekt
  # Aktualisieren Sie die Eigenschaften des Scatter-Diagramms, z.B. edgecolors, sizes, offsets
  scat.set_edgecolors(C) #Setzen Sie die Kantenfarbe
  scat.set_sizes(S)    #Setzen Sie die Größe
  scat.set_offsets(P)   #Setzen Sie den Abstand
  return scat,
animate = FuncAnimation(fig, update, frames = 300,interval=70)#Interval ist jede70 Millisekunden aktualisieren, Sie können help aufrufen
FFwriter = animation.FFMpegWriter(fps=20)  #Bilder pro Sekunde
animate.save('rain.mp4', writer=FFwriter,dpi=360)#Auflösungseinstellungen
plt.show()

Das generierte ist mp4Ich habe es in ein sehr kleines GIF umgewandelt und gezeigt, es scheint, dass das Speichern im Format GIF nicht funktioniert

Interessierte Leser, die mehr über Python erfahren möchten, können die Themenbereiche dieser Website besuchen: "Python-Datenstrukturen und Algorithmen-Lehrbuch", "Zusammenfassung der Techniken zur Verwendung von Python-Funktionen", "Zusammenfassung der Techniken zur Verwendung von Python-Strings", "Klassisches Lehrbuch für den Einstieg und die Fortbildung in Python" sowie "Zusammenfassung der Techniken zur Verwendung von Python-Dateien und Verzeichnissen"

Wir hoffen, dass der Artikel, den wir hier vorgestellt haben, Ihnen bei der Programmierung in Python weiterhelfen kann.

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheber. Der Inhalt wurde von Internetnutzern selbständig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine rechtlichen Verantwortlichkeiten. Wenn Sie Inhalte entdecken, die möglicherweise urheberrechtlich geschützt sind, freuen wir uns über eine E-Mail an: notice#oldtoolbag.com (Bitte ersetzen Sie # durch @, wenn Sie eine E-Mail senden, und geben Sie relevante Beweise an. Sobald die Anschuldigung bestätigt wird, wird dieser Inhalt sofort gelöscht, der als urheberrechtlich geschützt gilt.)