Adaptive - автоматическое масштабирование Y Range при обновлении гистограммы в боке через виджет выбора - PullRequest
0 голосов
/ 04 февраля 2020

Я не уверен, является ли мой вопрос дубликатом этого вопроса или этого , но они не являются воспроизводимыми и запутанными.

Это возможно в Bokeh, когда я использую виджет select и обновляю график для обновления диапазонов xy?

Это особенно полезно при работе с данными разной величины.

dictonary={'Station':['a','a','a','a','b','b','b','b','b'],'Passengers':[20,30,40,20,10000,15000,20000,8000,16000],'Date':[1,2,3,4,1,2,3,4,5]}
df=pd.DataFrame(dictonary)

source = ColumnDataSource(data=df)

def modify_doc(doc):
    station_list=['a','b']
    station_selected='a'
    df_r=df.copy()
    x_name='Date'
    y_name='Passengers'
    xrange=[0,df_r.Date.iloc[-1]]
    yrange=[0,df_r[y_name].max()]
    source = ColumnDataSource(data=df_r)
    hover=HoverTool(tooltips=[('Passengers','@Passengers'),('Station','@Station'),('Date','@Date')])
    plot=figure(title='Passengers for station',tools=[hover,'pan','wheel_zoom'], plot_width=400, plot_height=400,x_range=(xrange), y_range=(yrange))
    plot.vbar(x="Date", top="Passengers",source=source, width=1.5)
    def update_plot(attr, old, new):
        activity =  select.value
        data = df_r[df_r['Station'] == activity]
        source.data = ColumnDataSource(data=data).data


    select = Select(title='Select Station', value=station_selected, options=station_list)
    select.on_change('value', update_plot)

    layout=column(select, plot)
    doc.add_root(layout)
show(modify_doc)

Вот скриншоты выходов:

Station 'a' before zooming

Station 'a' after zooming

Station 'b' before zooming

1 Ответ

1 голос
/ 04 февраля 2020

Когда вы делаете это:

yrange=[0, df_r[y_name].max()]

Вы выключаете автоматизированный c диапазон данных и берете на себя всю ответственность за обновление диапазонов самостоятельно. Если вам нужно автоматическое c ранжирование данных, не устанавливайте y_range в вызове на figure вообще. Если вы хотите закрепить половину диапазона (например, до нуля), вы можете сделать это:

plot.y_range.start = 0 
...