2013-02-06 99 views
0

我有一個交互式圖形,在哪個繪圖上增量繪製,其中一個是時間塊。在matplotlib中修改填充區域

也就是說,在一個循環中我得到一些採樣數據,然後將它們添加到圖中現有的曲線並重畫圖片。爲此,我使用get/set_x/ydata函數。東西在這條線:

# Get initial data 
time = [1, 2, 3, 4, 5] 
samples = [0.1, 0.2, 0.3, 0.4, 0.5] 
c = plot_curve(time, samples) 
# Get new data 
time2 = [6, 7, 8] 
samp2 = [0.6, 0.7, 0.8] 
c.set_xdata(append(c.get_xdata(), time2)) 
c.set_ydata(append(c.get_ydata(), samp2)) 

問題是,我也填充曲線附近的一些區域(例如曲線與x軸之間的空間),使用fill_between。目前,我以這種方式創造很多小塊的:

# Filling initial chunk 
fill_between(time, samples, [0 for i in time]) 
# Filling next chunk 
fill_between(time[-1] + time2, samples[-1] + samp2, [0 for i in time2] + [0]) 

(我知道這個代碼太臭,但它給了一個想法)。

所以,問題是:有一條曲線,但填充區域是2(每個數據塊一個)。 這會在圖形中產生小的文物,因爲每個填充區域都非常靠近下一個區域,其間空間很小。

有沒有辦法在灌裝區域進行這種增量式工作?例如,可以很好地保持2條曲線(一條等於c.get_ydata()和一個零),並讓matplotlib自動填充它們之間的區域,而不必顯式調用該命令 - 以便填充區域始終與採樣點保持一致。

或者,另一個好方法是使用採樣點而不是多邊形來表示填充區域,以便我可以使用類似於get/set_x/ydata的方法更新區域。

+0

你整理出來了嗎? – tacaswell

+0

不幸的是... – AkiRoss

+1

我建議發郵件到郵件列表或在github上創建和發佈。 – tacaswell

回答

0

稍微少的hackish辦法做到這一點是做

pc = fill_between(time, samples) 

(注意,默認爲Y2 = 0,所以你並不需要該列表理解)

然後,當你更新你的身材

time2 = [6, 7, 8] 
samp2 = [0.6, 0.7, 0.8] 
time_update = append(c.get_xdata(), time2) 
samp_update = append(c.get_ydata(), samp2) 
c.set_xdata(time_update) 
c.set_ydata(samp_update) 
pc.remove() 
pc = fill_between(time_update, samp_update) 

而不是使一個新的更小的區域每一次的,剛擦了舊的和充分的所有數據重新創建它。不知道這將如何影響你的速度,但如果它比現在所做的慢,我會感到驚訝。

+0

好吧,我沒有嘗試性能比較,但你應該知道,採樣點可以是很高的數量,如百萬(> 1,<100),並且更新頻率可以相對較高(每1000個採樣或更少) 。 – AkiRoss

+0

@AkiRoss數據是否很流暢?在調用'fill_between'之前,你可能會急於進行下采樣(因爲你的顯示器上只有1k像素,反正它正在下降) – tacaswell

+0

不幸的是我已經考慮過這個選項了......數據一點都不順利。考慮到繪圖以矢量格式保存,允許表示比顯示器更寬。 – AkiRoss