Как обновить источник данных на основе раскрывающегося меню? - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть желаемый вывод, который мне нужен для графика p1 от обратного вызова, присоединенного к функции js_on_change выбранного виджета.Он отображает правильные данные на консоли javascript, но не обновляет график p1.У меня есть подобный вопрос, который был решен раньше, но по какой-то причине он не работает в этом случае.Может иметь какое-то отношение к select.js_on_change, но я не уверен.

source = ColumnDataSource(data={
        'CAUSE' : df.cause_of_death,
        'AGE_GROUP' : df.AGE_GROUP,
        'YEAR' : df.YEAR, 
        'DEATHS' : df.deaths, 
        'RATE' : df.rate, 
        })

rangeMax = 1800

#converting matplotlib colour map to fkin bokeh ones >:(
colormap =cm.get_cmap("gist_heat_r") #choose any matplotlib colormap here
bokehpalette = [plt.colors.rgb2hex(m) for m in colormap(np.arange(colormap.N))]

mapper = LinearColorMapper(palette = bokehpalette, low=min(df.deaths), high=rangeMax)

age_group = list(df.AGE_GROUP)

p1 = figure(title="Deaths caused by lung cancer in Australia from ({0} - {1})".format(yearMin, yearMax),
           x_range=[yearMin, yearMax], 
           y_range=[age_group[0], age_group[1], age_group[2], age_group[3], age_group[4], age_group[5], age_group[6], age_group[7], age_group[8], 
                    age_group[9], age_group[10], age_group[11], age_group[12], age_group[13], age_group[14], age_group[15]], 
                    plot_width = 800, 
                    plot_height = 350, 
                    tools = TOOLS, toolbar_location=None)

p1.grid.grid_line_color = None
p1.axis.axis_line_color = None
p1.axis.major_tick_line_color = None
p1.xaxis.axis_label = 'Year'
p1.yaxis.axis_label = 'Age Group'
p1.axis.major_label_text_font_size = "8pt"
p1.axis.major_label_standoff = 0
p1.xaxis.major_label_orientation = pi / 3

rc = p1.rect(x="YEAR", y="AGE_GROUP", width=1, height=1,
       source=source, 
       fill_color={'field': 'DEATHS', 'transform': mapper},
       line_color='white')


callback = CustomJS(args = {'rect': rc.data_source.data, 'source': source}, 
code = """
var x = source.data
var select = cb_obj.value


var data = {"AGE_GROUP": [],  "CAUSE": [], "DEATHS": [], "RATE": [], "YEAR": []}

var indices = x.CAUSE.map((e,i) => e === select ? i : '').filter(x => x)


for (var i = 0; i < indices.length; i++){     
    data.AGE_GROUP.push(x.AGE_GROUP[indices[i]])
}
for (var i = 0; i < indices.length; i++){     
    data.CAUSE.push(x.CAUSE[indices[i]])
}
for (var i = 0; i < indices.length; i++){     
    data.DEATHS.push(x.DEATHS[indices[i]])
}
for (var i = 0; i < indices.length; i++){     
    data.RATE.push(x.RATE[indices[i]])
}
for (var i = 0; i < indices.length; i++){     
    data.YEAR.push(x.YEAR[indices[i]])
}
console.log(x)
rect = {"AGE_GROUP": data.AGE_GROUP, "CAUSE": data.CAUSE, "DEATHS": data.DEATHS, "RATE": data.RATE, "YEAR": data.YEAR, }
console.log(rect)
"""
)

menu = ["Lung cancer (ICD-10 C33, C34)", "Prostate cancer (ICD-10 C61)", "Colorectal cancer (ICD-10 C18–C20, C26.0)", "Breast cancer (ICD-10 C50)"]
select = Select(title="Option:", value=menu[0], options=menu)
select.js_on_change('value', callback)

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

1 Ответ

0 голосов
/ 29 сентября 2019

Вы создаете новую локальную переменную data и ничего не делаете с ней.Он сбрасывается без эффекта, когда код обратного вызова заканчивается.Bokeh реагирует, когда его свойства объектов установлены, назначая свойства для объектов , которые вы не делаете.Если source является источником данных, который управляет любым глифом, который вы хотите обновить, вам нужно сделать:

source.data = data

То же самое верно для rect.Вы создаете новые локальные переменные .Они существуют в области кода функции обратного вызова, а затем исчезают.У Боке нет возможности что-либо увидеть или сделать с этим.

...