Есть ли способ перерисовать диаграммы боке?

У меня есть 2 диаграммы в боке и поле ввода. Поле ввода принимает значение и должно обновлять обе диаграммы. У меня есть функция под названием createDF, которая создает DF, а затем вызывает createPlot, который возвращает цифру в createDF, а затем createDF вызывает createDF2, который вызывает createPlot2, а затем возвращает цифру обратно в createDF. Теперь у нас есть 2 фигуры в createDF, мы объединяем их в список и возвращаемся обратно, а затем отображаем диаграммы следующим образом:

plot = createDF(market)
l = layout([[text_input], [plot[0]], [plot[1]]])
curdoc().add_root(l)

Вот как я пытаюсь обработать обновление:

def text_handler(attr, old, new):
    market = text_input.value
    plot = createDF(market)

    l = layout([[text_input], [plot[0]], [plot[1]]])
    curdoc().add_root(l)
text_input.on_change('value', text_handler)

Однако, когда я ввожу другой рынок, графики не обновляются. Как заставить их обновляться?

0
0
757
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Только две возможные детали, которые вы должны проверить:

Вы запускаете боке в серверном режиме? Это необходимо, поскольку вы используете функцию обратного вызова python (text_handler)

https://docs.bokeh.pydata.org/en/latest/docs/user_guide/server.html

Другая возможная проблема: вы создаете новые объекты-фигуры в своей функции обратного вызова вместо того, чтобы манипулировать уже существующими объектами.

Взгляните на один из примеров галереи боке:

https://github.com/bokeh/bokeh/blob/master/examples/app/movies/main.py

Создается сюжет и глиф:

p = figure(plot_height=600, plot_width=700, title="", toolbar_location=None, tooltips=TOOLTIPS)
p.circle(x="x", y="y", source=source, size=7, color="color", line_color=None, fill_alpha="alpha")

А потом в функции обновления модифицируют существующие экземпляры:

def update():
    df = select_movies()
    x_name = axis_map[x_axis.value]
    y_name = axis_map[y_axis.value]

    p.xaxis.axis_label = x_axis.value
    p.yaxis.axis_label = y_axis.value
    p.title.text = "%d movies selected" % len(df)
    source.data = dict(
        x=df[x_name],
        y=df[y_name],
        color=df["color"],
        title=df["Title"],
        year=df["Year"],
        revenue=df["revenue"],
        alpha=df["alpha"],
    )

Если вы сохраните ссылку на объект глифа:

my_glyph = p.circle(x="x", y="y", source=source, size=7, color="color", line_color=None, fill_alpha="alpha")

Позже (в функции обратного вызова) вы можете изменить, например, серию (столбец) источника данных, из которого должны поступать значения, или размер:

my_glyph.y = 'other_column_name'
my_glyph.size = 42

Да, я запускаю сервер, думаю, вы правы, я создаю новые цифры. Как обновить существующие?

user2896120 10.08.2018 18:48

Я добавил ссылку на галерею примеров боке и несколько фрагментов кода оттуда.

Moritz 10.08.2018 18:59

Другие вопросы по теме