2016-10-21 15 views
1

vbarColumnDataSourceに関連付けられており、一部のウィジェットの選択に基づいて更新されます。もし私がline_width=5で始まっていれば、それは私の最初のデータですばらしく見えます。ただし、グラフを更新すると、x_rangeは更新されたデータに合わせて更新され、バーの相対幅が変更されます。自動設定vbar line_widthはBokehのx_rangeに基づいて

理想的には、幅は常に表示されるバーの数に比例する必要があります。 x_rangexaxisのさまざまなプロパティを調べて、範囲を取得して幅を自分自身で計算できるかどうかを確認しようとしましたが、役に立たないものは見つかりませんでした。探しているとドキュメントと何もない。何かご意見は?

答えて

3

私は最終的に@bigreddotの助けを借りてこれを理解しました。間違った物件を使っていたことが判明しました。 line_widthの代わりにwidthを使用する必要がありました。 x_rangedatetimeの範囲であり、datetimesはミリ秒単位で表現されているため、正しく表示するには十分な幅が必要でした。これは、幅がx_axisの特定の期間を表しているため、ズームインするときに比例幅を設定する処理です。

カラムをグループ化してColumnDataSource.dataを更新する方法のfreqを変更する機能があるため、更新するときにwidthを再計算する必要があります。

def get_data(freq='MS'): 
    return pd.DataFrame(srs.groupby(pd.Grouper(freq=freq)).mean()) 

source = ColumnDataSource(data=ColumnDataSource.from_df(get_data())) 

def get_width(): 
    mindate = min(source.data['date']) 
    maxdate = max(source.data['date']) 
    return 0.8 * (maxdate-mindate).total_seconds()*1000/len(source.data['date']) 

f = figure(plot_width=550, plot_height=400, x_axis_type="datetime") 
f.x_range.set(bounds='auto') 
r = f.vbar(source=source, top='volume', x='date', width=get_width()) 
bar_glyph = f.renderers[-1].glyph 

handle = show(f, notebook_handle=True) 

と私の更新機能:

ここで作業コードです

def update_data(freq={'Quarter': 'QS', 'Month': 'MS', 'Week': 'W'}): 
    source.data = ColumnDataSource.from_df(get_data(freq)) 
    r.glyph.width = get_width() 
    push_notebook() 

i = interact(update_data) 
関連する問題