Почему мое приложение-сервер боке не обновляет фигуру - PullRequest
0 голосов
/ 09 мая 2020

вот мои данные : https://drive.google.com/drive/folders/1CabmdDQucaKW2XhBxQlXVNOSiNRtkMm-?usp=sharing я хочу использовать выбор, чтобы выбрать акции, которые я хочу показать; и ползунок, чтобы выбрать год, который я хочу показать; и группу флажков, чтобы выбрать индекс, с которым я хочу сравнить. проблема в том, что когда я регулирую ползунок, цифра обновляется, но когда я использую группу выбора и флажка, цифра не обновляется, в чем причина?

from bokeh.io import curdoc
from bokeh.layouts import column, row
from bokeh.models import ColumnDataSource, Slider, TextInput , Select , Div, CheckboxGroup
from bokeh.plotting import figure
import pandas as pd
import numpy as np

price=pd.read_excel('price.xlsx',index_col=0)
# input control

stock = Select(title='Stock',value='AAPL',options=[x for x in list(price.columns) if x not in ['S&P','DOW']])
yr_1 = Slider(title='Start year',value=2015,start=2000,end=2020,step=1)
yr_2 = Slider(title='End year',value=2020,start=2000,end=2020,step=1)
index = CheckboxGroup(labels=['S&P','DOW'],active=[0,1])

def get_data():
    compare_index = [index.labels[i] for i in index.active]
    stocks = stock.value
    start_year = str(yr_1.value)
    end_year = str(yr_2.value)

    select_list = []
    select_list.append(stocks)
    select_list.extend(compare_index)
    selected = price[select_list]
    selected = selected [start_year:end_year]
    for col in selected.columns:
        selected[col]=selected[col]/selected[col].dropna()[0]

    return ColumnDataSource(selected)

def make_plot(source):
    fig=figure(plot_height=600, plot_width=700, title="",sizing_mode="scale_both", x_axis_type="datetime")
    data_columns = list(source.data.keys())
    for data in data_columns[1:]:
        fig.line(x=data_columns[0],y=data,source=source,line_width=3, line_alpha=0.6, legend_label=data)
    return fig

def update(attrname, old, new):
    new_source = get_data()

    source.data.clear()
    source.data.update(new_source.data)


#get the initial value and plot
source = get_data()
plot = make_plot(source)

#control_update

stock.on_change('value', update)
yr_1.on_change('value', update)
yr_2.on_change('value', update)
index.on_change('active', update)


# Set up layouts and add to document
inputs = column(stock, yr_1, yr_2, index)

curdoc().add_root(row(inputs, plot, width=800))
curdoc().title = "Stocks"

1 Ответ

0 голосов
/ 09 мая 2020

Вы создаете новый ColumnDataSource для новых данных. Это не лучший подход. Вместо этого создайте его один раз, а затем просто назначьте его data соответствующим образом.

В вашем случае я бы сделал это так:

  1. Создайте ColumnDataSource только один раз, как описано выше
  2. Не используйте .update на CDS, просто переназначьте .data
  3. Создайте легенду вручную
  4. Для той одной строки, которая подвержена изменению выбора, выберите stati c x и используйте его везде вместо
  5. Измените метку первого элемента легенды, когда вы измените значение выбора вместо этого поля x, которое имеет правильное имя
...