2016-09-14 4 views
0

Ich möchte das Streudiagramm basierend auf dem tatsächlichen Zeitstempel aus der CSV-Datei (siehe unten) animieren. Ich bin nicht so gut mit Matplotlib und ich kenne die Animationsfunktion und die ion() - Funktion, aber ich bin mir nicht sicher, wie ich es umsetzen soll. Ich lese this, aber es schien sehr schwierig, es in meiner Art und Weise zu implementieren. Ich habe den Code unten versucht, aber es zeigt mir nur jede Schleife ein neues Fenster mit den tatsächlichen Daten, aber ich mag die Animation in einem Fenster Vielen Dank im Voraus haben :):Interaktive/animierte Streudiagramm mit Matplotlib

import pandas as pd 
import matplotlib.pyplot as plt 

start_time = 86930.00 
end_time = 86934.00 
df = pd.read_csv('Data.csv', delimiter=',') 

for timestamp in range(int(start_time), int(end_time), 1): 
    act_data = df.loc[df['timestamp'] == float(timestamp)] 
    X = act_data.x 
    Y = act_data.y 
    plt.scatter(X, Y) 
    plt.show() 

data.csv:

timestamp,id,x,y 
86930.00,1,1155.53,7155.05 
86930.00,2,3495.08,8473.46 
86931.00,1,3351.04,6402.27 
86931.00,3,3510.59,8021.62 
86931.00,2,2231.04,6221.27 
86931.00,4,3710.59,8111.62 
86932.00,2,3333.01,6221.27 
86932.00,1,3532.59,3178.62 
86933.00,3,1443.01,2323.27 
86933.00,4,5332.59,1178.62 

Es wäre cool, wenn ich die Blobs per ID färben könnte, aber nicht notwendig :).

+0

Ist das IPython/Jupyter Notebook eine Option hier? Sehr einfach, das dort zu machen. –

+0

Nein, es ist keine Option. Aber klingt interessant. Wie würdest du es dort machen? Vielleicht kann ich es portieren. – Blind0ne

+0

In einem Notebook können [Widgets] (https://jakevdp.github.io/blog/2013/05/19/a-javascript-viewer-for-matplotlib-animations/) solche Dinge leicht tun. –

Antwort

1

Der schnellste Weg auf derselben Achse zu animieren ist interaktive Plots zu verwenden, plt.ion

import pandas as pd 
import matplotlib.pyplot as plt 

start_time = 86930.00 
end_time = 86934.00 
df = pd.read_csv('Data.csv', delimiter=',') 


fig, ax = plt.subplots(1,1) 
plt.ion() 
plt.show() 

for timestamp in range(int(start_time), int(end_time), 1): 
    act_data = df.loc[df['timestamp'] == float(timestamp)] 
    X = act_data.x 
    Y = act_data.y 
    ax.scatter(X, Y) 
    plt.pause(1.0) 

Obwohl ich vermute, von Ihrem Titel, den Sie etwas interaktiven wollen, die Sie auch matplotlibslider widget verwenden können. Mit Ihnen Daten,

import pandas as pd 
import matplotlib.pyplot as plt 
from matplotlib.widgets import Slider 

start_time = 86930.00 
end_time = 86934.00 
df = pd.read_csv('Data.csv', delimiter=',') 


fig, ax = plt.subplots(1,1) 
plt.subplots_adjust(bottom=0.25) 
sax = plt.axes([0.25, 0.1, 0.65, 0.03]) 
slide = Slider(sax, 'time', start_time, end_time, valinit=start_time) 

#Initial plot 
act_data = df.loc[df['timestamp'] == float(int(start_time))] 
s, = ax.plot(act_data.x, act_data.y, 'o') 

def update(timestamp): 
    act_data = df.loc[df['timestamp'] == float(int(timestamp))] 
    X = act_data.x 
    Y = act_data.y 

    #Update data based on slider 
    s.set_xdata(X) 
    s.set_ydata(Y) 

    #Reset axis limits 
    ax.set_xlim([X.min()*0.9,X.max()*1.1]) 
    ax.set_ylim([Y.min()*0.9,Y.max()*1.1]) 

    fig.canvas.draw() 

slide.on_changed(update) 
plt.show() 
+0

Du bist großartig! – Blind0ne

Verwandte Themen