2017-07-18 5 views
0

私はcsvファイルからデータを読み込み、matplotlibアニメーションを使って "ライブストリーム"をプロットしています。 "matplotlib.dates.date2num"の値ではなく、x軸に時間を表示することを除いて、すべてうまく動作しています。これを行う簡単な方法はありますか?アニメーションプロットを数値としてではなくx軸に表示する方法

import numpy 
import matplotlib 
import matplotlib.pyplot as plt 
from matplotlib import animation 
import datetime 
from numpy import genfromtxt 


cv = numpy.genfromtxt ('file.csv', delimiter=",") 
second = cv[:,0] 
third = cv[:,2] 
FMT = '%Y-%m-%d-%H%M%S.%f' 
data = numpy.genfromtxt('file.csv', delimiter=',', skip_header=2,names=['t', 'in', 'x', 'y','z'], dtype=['object', 'int8', 'float', 'float', 'float'])     
d = [datetime.datetime.strptime(i.decode('ascii'), FMT) for i in data['t']] 

conversion3 = [matplotlib.dates.date2num(j) for j in d] 
mytime3 = numpy.array(conversion3) 

x = mytime3 
y = third    
fig, ax = plt.subplots() 
line, = ax.plot([], [], 'b-') 
ax.margins(0.05) 

def init(): 
    line.set_data(x[:2],y[:2]) 
    return line, 

def animate(i): 
    win = 150 
    imin = min(max(0, i - win), x.size - win) 
    xdata = x[imin:i] 
    ydata = y[imin:i] 
    line.set_data(xdata, ydata) 

    ax.relim() 
    ax.autoscale() 
    return line, 

anim = animation.FuncAnimation(fig, animate, init_func=init, interval=25) 

plt.show() 

csvファイルの形式は次のとおりです。

2016-07-11-095303.810,1,79 
2016-07-11-095303.900,1,77 
2016-07-11-095303.990,1,59 
2016-07-11-095304.080,1,48 
2016-07-11-095304.170,1,48 
2016-07-11-095304.260,1,77 
2016-07-11-095304.350,1,81 
2016-07-11-095304.440,1,63 
2016-07-11-095304.530,1,54 
2016-07-11-095304.620,1,29 
+0

あなたは[日付例](https://matplotlib.org/1.5.3/examples/pylab_examples/date_demo1.htmlのように 'DateFormatter'を使用してみました)?実際に日付を数字に変換する必要はありますか?日付を直接プロットしてみませんか?問題の[mcve]を提供することによって、他の人がサンプルデータを再作成する必要がないように、他の人が助けてくれるように助けてください。 – ImportanceOfBeingErnest

+0

DateFormatterを使用しようとしましたが、空白のキャンバスになりました。私は直接日付をプロットしようとします – Sjoseph

+0

私は日付を直接プロットしようとしましたが、再び空白のキャンバスに終わりました。日付が必要な形式がありますか? – Sjoseph

答えて

0

あなたは、これが自動的にダニをフォーマットしますが、代わりにplotplot_dateを使用することができます。変換された数値ではなく、日付をプロットする必要があります。

次は正常に動作:

u = u"""2016-07-11-095303.810,1,79 
2016-07-11-095303.900,1,77 
2016-07-11-095303.990,1,59 
2016-07-11-095304.080,1,48 
2016-07-11-095304.170,1,48 
2016-07-11-095304.260,1,77 
2016-07-11-095304.350,1,81 
2016-07-11-095304.440,1,63 
2016-07-11-095304.530,1,54 
2016-07-11-095304.620,1,29""" 

import io 
import numpy 
import matplotlib.pyplot as plt 
from matplotlib import animation 
import datetime 
from numpy import genfromtxt 


cv = numpy.genfromtxt (io.StringIO(u), delimiter=",") 
second = cv[:,0] 
third = cv[:,2] 
FMT = '%Y-%m-%d-%H%M%S.%f' 
data = numpy.genfromtxt(io.StringIO(u), delimiter=',', skip_header=2, 
         names=['t', 'in', 'x', 'y','z'], 
         dtype=['object', 'int8', 'float']) 
d = [datetime.datetime.strptime(i.decode('ascii'), FMT) for i in data['t']] 


x = d 
y = data["x"]   
fig, ax = plt.subplots() 
line, = ax.plot_date([], [], 'b-') 
ax.margins(0.05) 

def init(): 
    line.set_data(x[:2],y[:2]) 
    return line, 

def animate(i): 
    imin = 0 #min(max(0, i - win), x.size - win) 
    xdata = x[imin:i+2] 
    ydata = y[imin:i+2] 
    line.set_data(xdata, ydata) 

    ax.relim() 
    ax.autoscale() 
    return line, 

anim = animation.FuncAnimation(fig, animate, frames=7,init_func=init, interval=150) 

plt.show() 
+0

そのコードは素晴らしい動作します!しかし、スライディングウィンドウを再実装しようとすると、空白のキャンバスになりますか?私はより大きいCSVファイルで作業するためのスライディングウィンドウが必要です – Sjoseph

関連する問題