2016-09-14 4 views
0

Я хочу анимировать график рассеяния на основе фактической метки времени из файла csv (см. Ниже). Я не очень хорошо разбираюсь в matplotlib, и я знаю о функции анимации и функции ion(), но я не уверен, как ее реализовать. Я читал this, но мне казалось очень сложно реализовать его на моем пути. Я попытался код ниже, но это только показывает мне каждую петлю нового окно с фактическими данными, но я хотел бы иметь анимацию в одном окне заранее спасибо :):Интерактивный/анимированный разброс с использованием 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 

Было бы здорово, если бы я мог покрасить капли по ID, но не обязательно :).

+0

Возможно ли в ноутбуке IPython/Jupyter? Очень легко сделать это. –

+0

Нет, это не вариант. Но звучит интересно. Как бы вы это сделали? Может быть, я смогу его перенести. – Blind0ne

+0

В ноутбуке [виджетов] (https://jakevdp.github.io/blog/2013/05/19/a-javascript-viewer-for-matplotlib-animations/) можно легко делать такие вещи. –

ответ

1

Самый быстрый способ анимировать на одной оси, чтобы использовать интерактивные графики, 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) 

Хотя, я подозреваю, от Вашего названия вы хотите что-то интерактивное, который вы можете также использовать matplotlibslider widget. С вашими данными,

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

Ты потрясающий! – Blind0ne

Смежные вопросы