2016-03-02 69 views
1

我是Bokeh和Python的新手,這也是我的第一個Stack Overflow問題。使用散景循環動畫

我正在使用散景來繪製散佈在大腦中的粒子的軌跡輪廓,但要讓它具有動畫效果。我已經能夠成功地創建一個繪製點的程序,但是一旦繪製了所有點,它就會停止。我希望能夠循環動畫,以便一旦所有點都被繪製出來,它就會自行清除並重新開始。

我對編碼術語還很陌生,而且我無法找到能做到這一點的事情。我認爲我在if語句中使用重置函數導入了正確的軌道,但它似乎不起作用。我已經看着下面還有供參考:

How to animate a circle using bokeh bokeh.pydata.org/en/0.10.0/docs/reference/resources_embedding.html#bokeh-state

這裏是我到目前爲止的代碼繪製一個隨機的軌跡:

import numpy as np 
from bokeh.plotting import figure, show, gridplot, vplot, hplot, curdoc 
from bokeh.io import output_notebook 
from bokeh.client import push_session 
from bokeh.core.state import State as new 

# This is where the actual coding begins. 
b = np.random.rand(300, 3) 
xlist = b[:, 1] 
ylist = b[:, 2] 

# create a plot and style its properties. Change chart title here. 
p = figure(title='PEG_PLGA15k_F68_R2_P81', title_text_font_size='13pt', 
     x_range=(min(xlist), max(xlist)), y_range=(min(ylist), max(ylist)),) 

# add a text renderer to out plot (no data yet) 
r = p.line(x=[], y=[], line_width=3, color='navy') 

session = push_session(curdoc()) 

i = 0 
ds = r.data_source 


# create a callback that will add a number in a random location 
def callback(): 
    global i 
    ds.data['x'].append(xlist[i]) 
    ds.data['y'].append(ylist[i]) 
    ds.trigger('data', ds.data, ds.data) 
    if i < xlist.shape[0] - 1: 
     i = i + 1 
    else: 
     new.reset() 

# Adds a new data point every 67 ms. Change at user's discretion. 
curdoc().add_periodic_callback(callback, 67) 

session.show() 

session.loop_until_closed() 
+0

從session.show()中缺少'p',所以正確的函數調用是'session.show(p)',否則不顯示圖 – ragesz

回答

1

如果你想要的是,一旦你達到某個條件(如「所有點都被繪製」)重新啓動動畫你可以重新設置數據源。所以,舉例來說,在你的例子中,你應該有:

else: 
    i = 0 
    ds.data['x'] = [] 
    ds.data['y'] = [] 

代替:

else: 
    new.reset() 

而且應該做的伎倆。只需使用您的數據源... State是一個更通用的組件,應該在不同級別上使用,而不是管理劇情字形和數據源。

一對夫婦在這裏快速註解:

  1. 在你的問題你提到的鏈接0.10版本的文檔,但是從你的代碼,我可以不使用較新的版本(0.11.x)告訴。始終確保使用適用於您正在使用的Bokeh版本的文檔,因爲在項目到達1.0之前,版本與另一版本之間可能會發生一些變化。

  2. 你不需要調用ds.trigger('data', ds.data, ds.data)因爲背景虛化的屬性系統會自動檢測你改變你的回調中的數據源領域

  3. 你正在設計/運行腳本爲使用客戶端會話的背景虛化腳本到服務器(所以你會有一個運行的散景服務器的地方,你的腳本與它通信)。我建議您考慮將代碼作爲Bokeh應用運行,以便您的會話和代碼在散景服務器實例中運行。您可以在bokeh server section on the official docs處查看有關差異的更多詳細信息。