簡體   English   中英

python 散景動態更新分類 x_range

[英]python bokeh dynamically update categorical x_range

我想在散景中創建燭台 plot 並根據用戶通過 MultiSelect 小部件的輸入動態更新 x 軸。 基本上,用戶將在 MultiSelect 中選擇一些項目,然后我希望這些項目成為 x 軸的值。 我已經設置了 MultiSelect 小部件,並通過將 DataTable 附加到 MultiSelect 並使其相應更新(確實如此)來確認它正在工作。 我只需要幫助從 MultiSelect 小部件中檢索值並將它們設置為我的 plot.x_range。 基於一些 github/issues 帖子(例如: https://github.com/bokeh/bokeh/issues/4022 ),我嘗試使用 FactorRange,但它不起作用。 目前的行為是 x 軸標簽保持設置為在 MultiSelect 的初始配置期間設置的值('aaa' 和 'bbb'),並且當我在 MultiSelect 小部件中選擇不同的值時不會更改。

這是一個代碼示例:

### SET UP SOURCE DF INFO ###
tab2_source = ColumnDataSource(df)
tab2_original_source = ColumnDataSource(df)
columns_t2 = [TableColumn(field='Gene', title='Gene'), TableColumn(field='row_min', title='min'), TableColumn(field='row_max', title='max'), 
             TableColumn(field='quantile_25', title='25th quantile'), TableColumn(field='quantile_50', title='50th quantile'), TableColumn(field='quantile_75', title='75th quantile')]
data_table_t2 = DataTable(source=tab2_source, columns=columns_t2, reorderable=False)

### STUFF FOR THE WIDGETS ###
# customJS stuff
tab2_callback_code = """
var t2_data = tab2_source.data;
var t2_original_data = tab2_original_source.data;
var gene_t2 = gene_select_obj_t2.value;
console.log("gene: " + gene_t2);
for (var key in t2_original_data) {
    t2_data[key] = [];
    for (var i = 0; i < t2_original_data['Gene'].length; ++i) {
        if (t2_original_data['Gene'][i] === gene_t2[0] || t2_original_data['Gene'][i] === gene_t2[1]) {
            t2_data[key].push(t2_original_data[key][i]);
        }
    }
}

tab2_source.change.emit();
target_obj_t2.change.emit();
"""

# make drop-down selectors
select_gene_t2 = MultiSelect(title = "Select up to 2 Genes to View:", value=['aaa', 'bbb'], options=list(df.Gene.unique()))

# define the callback objects now that the select widgets exist
tab2_callback = CustomJS(
    args=dict(tab2_source=tab2_source,
             tab2_original_source=tab2_original_source,
             gene_select_obj_t2=select_gene_t2,
             target_obj_t2=data_table_t2),
    code=tab2_callback_code)

# connect the callbacks to the filter widgets
select_gene_t2.js_on_change('value', tab2_callback)


## PLOTTING ##
p2 = figure(plot_width=500, plot_height=400, title='Avg Gene Exp', y_range=(-2,12), x_range=FactorRange())
p2.x_range.factors = list(select_gene_t2.value)
p2.vbar(x='Gene', top='quantile_75', bottom='quantile_25', source=tab2_source, width=0.5, fill_color="#D5E1DD", line_color="black")
tab2 = Panel(child=column(select_gene_t2, p2, data_table_t2), title="Exp by Gene")
tabs = Tabs(tabs=[tab2])
save(tabs)

對於任何有興趣的人,這是我找到的最佳解決方案:

將此行添加到 tab2_callback_code (plot_xr 引用我的圖 p2 - 您還需要在 CustomJS args 字典中添加這些引用):

plot_xr.x_range.factors = gene_t2;

在調用 tab2_callback_code 之前實例化圖形也很重要。 這對我有用,現在我的 x_range 值隨着我 select MultiSelect 中的不同選項而改變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM