2017-05-12 5 views
1

Ich bin derzeit versucht, ein Streudiagramm der monatlichen Daten in einem Pandas Datenrahmen gespeichert zu animieren. Bisher habe ich eine Schleife erstellt, die eine einzelne Zeichnung nach der anderen erzeugt. Jetzt möchte ich ihnen in einem einzigen gif (oder mp4 ist mir egal) beitreten. Gibt es eine einfache Möglichkeit, die Mathplotlibs-Animationsfunktion zu nutzen? Ich kann nicht verstehen, wie man geschnittene Daten durch FuncAnimation zurückschleifen kann. Bisher habe ich dies:wie ein Streudiagramm von Pandas Daten mit matplotlib animieren

time = df.monat.unique() 
for i in time: 
    dft = df[(df.monat == i) & (df.xcol < 4000)] 
    plt.scatter(x=dft['xcol'], 
      y=dft['ycol'], 
      s=dft['scol']/25, 
      c=dft['clr'], 
      linewidth=0, 
      alpha=0.8) 
    plt.title('Title ' + str(i), fontsize=10) 
    plt.xlabel('x label', fontsize=9) 
    plt.ylabel('y label', fontsize=9) 
    legend1_line2d = list() 
    for val in clrdict.values(): 
     legend1_line2d.append(mlines.Line2D([0], [0], 
      linestyle='none', 
      marker='o', 
      alpha=0.6, 
      markersize=6, 
      markeredgecolor=None, 
      markeredgewidth=0, 
      markerfacecolor=val)) 
    legend1 = plt.legend(legend1_line2d, 
      names, 
      frameon=False, 
      numpoints=1, 
      fontsize=8, 
      loc='upper right') 
    plt.show() 

Antwort

0

ich es dachte, von mir aus:

generieren ein leeres Grundstück (Bild). Wie zuvor werden alle eindeutigen Zeitwerte in einer Reihe (Zeit) gespeichert. Ein einfacher Zähler (i) hilft bei der Generierung der korrekten Scheibe der Daten (dft) für jeden Monat (df.monat == ein Wert aus der Serie 'time') innerhalb der Update-Funktion. Die update-Funktion heißt mal der Wert des frame-parameters in der anim.FuncAnimation (frames = len (time)).

Hoffnung, dies hilfreich sein wird für jemand anderen (die meisten der Erklärungen für die matplotlib FuncAnimation ich mit Zufallszahlen gearbeitet gefunden haben - nicht mit spezifischen Pandas Spalten):

import pandas as pd 
import matplotlib.pyplot as plt 
import matplotlib.lines as mlines 
import matplotlib.animation as anim 

... 

time = df.monat.unique()  
fig = plt.figure() 
i = 1 

def update(i): 
     plt.clf() 
     dft = df[(df.monat == time[i]) & (df.xcol < 4000)] 
     plt.scatter(x=dft['xcol'], 
        y=dft['ycol'], 
        s=dft['scol']/25, 
        c=dft['clr'], 
        linewidth=0, 
        alpha=0.8) 
     plt.title('Title ' + str(time[i]), fontsize=10) 
     plt.xlabel('x label', fontsize=9) 
     plt.ylabel('y label', fontsize=9) 
     plt.xlim(0, 900) # fixed dimensions x 
     plt.ylim(-5, 100) # fixed dimensions y 
     legend1_line2d = list() 
     for val in clrdict.values(): 
      legend1_line2d.append(mlines.Line2D([0], [0], 
        linestyle='none', 
        marker='o', 
        alpha=0.6, 
        markersize=6, 
        markeredgecolor=None, 
        markeredgewidth=0, 
        markerfacecolor=val)) 
     legend1 = plt.legend(legend1_line2d, 
        names, 
        frameon=False, 
        numpoints=1, 
        fontsize=8, 
        loc='upper right') 
     i += 1 

ani = anim.FuncAnimation(fig, update, frames=len(time), interval=500) 
# plt.show() # this will show the ani over and over 
ani.save("test.mp4", dpi=200, fps=1, codec="libx264", bitrate=5000, extra_args=['-pix_fmt', 'yuv420p']) 
Verwandte Themen