2011-06-17 92 views
2

我一直在用matplotlib示例頁面的這一部分代碼進行指令。我試圖讓x軸保持給定的窗口。例如,畫布將從x = 0到30,1到31,2到32進行繪製。現在,我的x會開始顯示。我還沒有能夠定義一個設置的窗口大小。任何人都可以指向正確的方向。在matplotlib中調整活動繪圖(串行數據流)的x軸範圍

從我的試驗看來,無論x具有什麼樣的價值,y都需要具有相同的長度。那麼對於我的程序,我只想讓一串串數據被繪製出來。我是否要走這條路?

import time 
import matplotlib 
matplotlib.use('TkAgg') # do this before importing pylab 
import matplotlib.pyplot as plt 
import random 

fig = plt.figure() 
ax = fig.add_subplot(111) 

y = [] 

def animate(): 

    while(1): 
     data = random.random() 
     y.append(data) 
     x = range(len(y)) 

     line, = ax.plot(y) 
     line.set_ydata(y) 
     fig.canvas.draw() 

win = fig.canvas.manager.window 
fig.canvas.manager.window.after(100, animate) 
plt.show() 

回答

0

這是一個簡單的版本,它顯示y的最後30分(實際上它只是丟棄除了最後一個30點的所有數據,因爲它聽起來像你並不需要保存的話),但x軸標籤留在0-30永遠,這大概不是你想要的東西:

def animate(y, x_window): 
    while(1): 
     data = random.random() 
     y.append(data) 
     if len(y)>x_window: 
      y = y[-x_window:] 
     x = range(len(y)) 
     ax.clear() 
     line, = ax.plot(y) 
     line.set_ydata(y) 
     fig.canvas.draw() 

fig = plt.figure() 
ax = fig.add_subplot(111) 
y = [] 
win = fig.canvas.manager.window 
fig.canvas.manager.window.after(100, animate(y,30)) 

所以我加一個偏移變量來跟蹤我們多少Y的切斷,再加上一點數到所有帶有set_xtick標籤的x軸標籤:

def animate(y, x_window): 
    offset = 0 
    while(1): 
     data = random.random() 
     y.append(data) 
     if len(y)>x_window: 
      offset += 1 
      y = y[-x_window:] 
     x = range(len(y)) 
     ax.clear() 
     line, = ax.plot(y) 
     line.set_ydata(y) 
     ax.set_xticklabels(ax.get_xticks()+offset) 
     fig.canvas.draw() 

fig = plt.figure() 
ax = fig.add_subplot(111) 
y = [] 
win = fig.canvas.manager.window 
fig.canvas.manager.window.after(100, animate(y,30)) 

這是否工作?

1

您還可以更改x和y數據,然後更新繪圖限制。我不知道你打算運行多久,但你應該考慮在某些時候傾銷不需要的y數據。

import matplotlib 
matplotlib.use('TkAgg') # do this before importing pylab 
import matplotlib.pyplot as plt 
import random 

fig = plt.figure() 
ax = fig.add_subplot(111) 

x = range(30) 
y = [random.random() for i in x] 
line, = ax.plot(x,y) 

def animate(*args): 
    n = len(y) 
    for 1: 
     data = random.random() 
     y.append(data) 

     n += 1 
     line.set_data(range(n-30, n), y[-30:]) 
     ax.set_xlim(n-31, n-1) 
     fig.canvas.draw() 

fig.canvas.manager.window.after(100, animate) 
plt.show() 
+0

這是偉大的,非常接近我想要我的最終產品。我打算一次運行大約7小時,並且每小時或每秒都會發出警報。非常感謝您的幫助。歡呼! – brn2bfre

+0

快你是否在生成數字?你可能想要更頻繁地做。 – matt