2016-09-14 74 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 

這將是很酷,如果我可以通過身份證的顏色斑點,但沒有必要:)。

+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

相關問題