如何使用bokeh服务器更新bokeh.plotting.figure.y_axis

时间:2019-02-12 06:29:48

标签: bokeh

-在我能够重现该问题并对其有所了解之后进行了更新。

当我为Bokeh Server设置图形时,我在y_range上添加25,以便在顶部添加一些标签填充。

plot = figure(x_range=chart_data_source.data['we'],
    plot_height=250,
plot.y_range.end = max(chart_data_source.data['total']+25)

稍后,通过回调更新数据源后,我想重新设置y_range。下面的行在我的更新函数中,由任何multiselect小部件中的更改调用。关于我的身材的所有其他一切都变化很好,但是y_range却没有。我尝试更新y_range:

plot.y_range.end = max(chart_data_source.data['total'] + 25)

这不会更新y_range。知道如何在bokeh服务器中更新y_range吗?
散景服务器版本1.0.4

2 个答案:

答案 0 :(得分:0)

Range1d是一个对象,具有startend属性,您可以更新这些属性。将一个数字分配为整个范围没有意义。

plot.y_range.end = max(chart_data_source.data['total'] + 25)

您看到的错误消息是由于其他原因引起的,但是如果没有更多代码,则无法推测。

答案 1 :(得分:0)

我弄清楚了为什么我的y_range没有被更新。如果我独立设置y_range.max,那么以后将无法在update()函数中对其进行“重置”。但是,如果我在声明该图时进行了设置,则可以在我的update()函数中更新该值。这是Bokeh的预期行为吗?

import pandas as pd
import numpy as np
from bokeh.io import curdoc
from bokeh.layouts import layout
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource
from bokeh.models.widgets import Button


def populate_table_source(df):
    ds = {}
    for col in list(df):
        ds[col] = df[col]
    return ds


colors = ["#c9d9d3", "#718dbf", "#e84d60"]
years = ['2015', '2016', '2017']
data = {'fruits': ['Apples', 'Pears', 'Nectarines', 'Plums', 'Grapes', 'Strawberries'],
        '2015': [2, 1, 4, 3, 2, 4],
        '2016': [5, 3, 4, 2, 4, 6],
        '2017': [3, 2, 4, 4, 5, 3]}
df_chart = pd.DataFrame(data)
df_chart['total'] = df_chart[years].sum(axis=1)

print(df_chart)
chart_data_source = ColumnDataSource(data={})
chart_data_source.data = populate_table_source(df_chart)

years = ['2015', '2016', '2017']
# set up widgets
button = Button(label="Update", button_type="success")


p = figure(x_range=chart_data_source.data['fruits'],
           plot_height=250,
           plot_width=1000,
           title="Fruit Counts by Year",
           tools="hover,save",
           tooltips="$name: @$name",
           y_range=(0, 10) # can be updated if you assign it here
           )
p.vbar_stack(years,
             x='fruits',
             width=0.9,
             color=colors,
             source=chart_data_source,
             )

# p.y_range.start = 0
# p.y_range.end = 10 # can't be udpated if you assign it here

def update_data():
    data = {'fruits': ['Apples', 'Pears', 'Nectarines', 'Plums', 'Grapes', 'Strawberries'],
            '2015': [np.random.randint(5), np.random.randint(5), np.random.randint(5), np.random.randint(5),
                     np.random.randint(5), np.random.randint(5)],
            '2016': [np.random.randint(5), np.random.randint(5), np.random.randint(5), np.random.randint(5),
                     np.random.randint(5), np.random.randint(5)],
            '2017': [np.random.randint(5), np.random.randint(5), np.random.randint(5), np.random.randint(5),
                     np.random.randint(5), np.random.randint(5)],
            }
    df_chart = pd.DataFrame(data)
    df_chart['total'] = df_chart[years].sum(axis=1)
    chart_data_source.data = populate_table_source(df_chart)
    old_y_range = p.y_range.end
    p.y_range.end = old_y_range + 2


# Set up layout
button.on_click(update_data)
lo = layout(button, p)

curdoc().add_root(lo)
curdoc().title = "MVE"