2017-07-26 53 views
0

我試圖使用matplotlib中的animation函數生成實時數據圖。我指的是來自以下鏈接的本教程以獲得我的支持:Realtime Plotting in MatPlotLib使用matplotlib和更新文本文件生成實時圖

正在讀取的data.txt文件正在每秒更新一次新數據。進入的數據如下所示:[0.0263671875, 0.03515625, 1.0087890625][0.01171875, 0.0146484375, 0.4404296875][0.01171875, 0.0146484375, 0.4404296875] ...等等。

animate函數的前三行的每個陣列中提取所述第三元件:

data = pd.read_csv("C:\\Users\\Desktop\\data.txt", sep="\[|\]\[|\]",engine = 'python', header = None) 
    data = data.iloc[0] 
    data = data.astype(str).apply(lambda x: x.split(',')[-1]).astype(float) 
    data.pop(0) 

我在Jupyter筆記本驗證了這個代碼和輸出如下所示(並且什麼我尋找) : enter image description here

我的第一個挑戰來自於我試圖實時生成圖形。我的數據沒有x軸(時間)。所以,我的第一個障礙是在數據流更新時生成一個虛擬的x軸。上述鏈接教程中的代碼被用作模板。我將指出我爲了特定目的而努力修改的領域。

fig = plt.figure() 
ax1 = fig.add_subplot(1,1,1) 

def animate(i): 
    data = pd.read_csv("C:\\Users\\Desktop\\data.txt", sep="\[|\]\[|\]",engine = 'python', header = None) 
    data = data.iloc[0] 
    data = data.astype(str).apply(lambda x: x.split(',')[-1]).astype(float) 
    data.pop(0) 
    xar = [] 
    yar = [] 
    for eachLine in data: 
     if len(eachLine)>1: 
      x,y = eachLine.split(',') 
      xar.append(int(x)) 
      yar.append(int(y)) 
    ax1.clear() 
    ax1.plot(xar,yar) 
ani = animation.FuncAnimation(fig, animate, interval=1000) 
plt.show() 

除了人爲地製造x軸的號碼,這樣我可以創建劇情,我還需要修改for循環:

xar = [] 
yar = [] 
for eachLine in data: 
    if len(eachLine)>1: 
     x,y = eachLine.split(',') 
     xar.append(int(x)) 
     yar.append(int(y)) 

在鏈接提供的例子,他們的數據流有一個xy數據點,由一列分隔。我擁有的數據流只是一個值。

我該如何修改我的代碼(1)添加一個合適的x軸以便能夠繪製和(2)正確地通過for循環以便將值附加到xaryar以繪製圖實時。

編輯1 我試過以下,但它不起作用,需要一些幫助......但這是我的第一槍。我得到的錯誤:

if len(eachLine)>1: 

TypeError: object of type 'numpy.float64' has no len() 

我的代碼如下:

def animate(i): 
    data = pd.read_csv("C:\\Users\\Desktop\\data.txt", sep="\[|\]\[|\]",engine = 'python', header = None) 
    data = data.iloc[0] 
    data = data.astype(str).apply(lambda x: x.split(',')[-1]).astype(float) 
    data.pop(0) 
    xar = [] 
    yar = [] 
    for j in range(len(data)): 
     xar.append(j) 
    for k in range(len(data)): 
     yar.append(data.iloc[k]) 
    for eachLine in data: 
     if len(eachLine)>1: 
      x,y = eachLine.split('') 
      xar.append(int(x)) 
      yar.append(int(y)) 
    ax1.clear() 
    ax1.plot(xar,yar) 
ani = animation.FuncAnimation(fig, animate, interval=1) 
plt.show() 

謝謝!

+0

代碼看起來完全沒從數據幀繪製列。我根本不理解這個問題。 – ImportanceOfBeingErnest

+0

問題是進入的數據流看起來像Jupyter筆記本的輸出內容。它只有我的「y值」。我目前沒有任何x值能夠建立我的情節。 – Gary

+0

我認爲你的問題太重視你不想使用的例子,而不是你實際使用的例子。無論如何,你可能想提供一個[mcve]的問題。 – ImportanceOfBeingErnest

回答

1

對於讀入的數據沒有任何線索,很難理解這個問題。但是一般情況下您會如下

fig = plt.figure() 
ax = fig.add_subplot(1,1,1) 

def animate(i): 
    data = pd.read_csv(...) 
    yar = data[ "column to plot" ] 
    xar = range(len(data)) 
    ax.clear() 
    ax.plot(xar,yar) 

ani = animation.FuncAnimation(fig, animate, interval=10) 
plt.show()