Python 3.x 组合两个变量以选择小部件bokeh

Python 3.x 组合两个变量以选择小部件bokeh,python-3.x,callback,widget,bokeh,Python 3.x,Callback,Widget,Bokeh,我正在尝试为bokeh中的select小部件创建一个带有两个绘图的CustomJS回调,不过我一直在研究如何在一个两个绘图中组合两个变量。 回调将起作用,但它将根据选定的一个变量更改两个图。 这是密码,如果有人能帮我,那就太好了。 import pandas as pd import numpy as np from bokeh.layouts import column, row, gridplot from bokeh.models import ColumnDataSource, Cu

我正在尝试为bokeh中的select小部件创建一个带有两个绘图的CustomJS回调,不过我一直在研究如何在一个两个绘图中组合两个变量。
回调将起作用,但它将根据选定的一个变量更改两个图。
这是密码,如果有人能帮我,那就太好了。

import pandas as pd
import numpy as np

from bokeh.layouts import column, row, gridplot
from bokeh.models import ColumnDataSource, CustomJS, Select, HoverTool, Slider, Range1d, TapTool, HBar, Panel, Tabs
from bokeh.plotting import figure
from bokeh.io import (output_notebook, show, curdoc, output_file)
from bokeh.palettes import Pastel2, viridis
import matplotlib.pyplot as plt

dfswpop = pd.read_csv('SwedishPop_5ys.csv', delimiter=',')
df_pivot = dfswpop.pivot_table(values=['2007', '2008','2009','2010','2011','2012','2013','2014','2015','2016','2017','2018','2019'], index='sex', columns='ageGroup')
df_pivot
dfswpopM = pd.DataFrame(df_pivot.loc['male'][yrs])
dfswpopF = pd.DataFrame(df_pivot.loc['female'][yrs])

sourceS = ColumnDataSource(data=dict(y=gs, x15m=df_pivot.loc['male']['2015'], x16m=df_pivot.loc['male']['2016'], x17m=df_pivot.loc['male']['2017'], x18m=df_pivot.loc['male']['2018'], x19m=df_pivot.loc['male']['2019'],
                                    x15f=df_pivot.loc['female']['2015'], x16f=df_pivot.loc['female']['2016'], x17f=df_pivot.loc['female']['2017'], x18f=df_pivot.loc['female']['2018'], x19f=df_pivot.loc['female']['2019']))

gs = list(dfswpop['ageGroup'].unique())

pm = figure(y_axis_location = None, plot_height=300, plot_width=250, y_range=gs)
pm.hbar(y='y', height=1, right='x15m',  source=sourceS, legend_label='male', line_color="white", fill_color='#FDE724')
#plot style
hoverpm = HoverTool()
hoverpm.tooltips=[('Population', '@x15m')]
pm.add_tools(hoverpm)
pm.x_range.flipped = True
pm.grid.grid_line_color=None
pm.outline_line_color=None
pm.x_range.range_padding = 0
pm.axis.major_label_text_font_style = 'bold'
pm.toolbar.autohide = True
pm.axis.axis_line_color = None
pm.legend.location = 'top_left'
pm.legend.background_fill_alpha = None
pm.legend.border_line_color = None
pm.xaxis.formatter.use_scientific = False
pm.xaxis.major_label_text_font_size = '7pt'
#pm.xaxis.major_label_orientation = 45
tick_labels_pm = {'50000':'50K','100000':'100K','150000':'150K','200000':'200K','250000':'250K', '300000':'300K'}
pm.xaxis.major_label_overrides = tick_labels_pm

pf = figure(plot_height=300, plot_width=280, y_range=gs)
pf.hbar(y='y', height=1, right='x15f',  source=sourceS, legend_label='female', line_color="white", fill_color='#440154')


hoverpf = HoverTool()
hoverpf.tooltips=[('Population', '@x15f')]

    #plot style
pf.add_tools(hoverpf)
pf.legend.background_fill_alpha = None
pf.legend.border_line_color = None
pf.yaxis.major_label_standoff = -1
pf.yaxis.major_label_text_font_size = '8pt'
pf.xaxis.major_label_text_font_size = '7pt'
pf.grid.grid_line_color=None
pf.outline_line_color=None
pf.yaxis.major_label_text_align = 'center'
pf.axis.major_label_text_font_style = 'bold'
pf.yaxis.major_tick_line_color = None
pf.axis.axis_line_color = None
pf.min_border = 0
pf.x_range.range_padding = 0
pf.toolbar.autohide = True
pf.yaxis.major_label_standoff = 0
pf.xaxis.formatter.use_scientific = False
#pf.xaxis.major_label_orientation = 45
tick_labels_pf = {'50000':'50K','100000':'100K','150000':'150K','200000':'200K','250000':'250K', '300000':'300K'}
pf.xaxis.major_label_overrides = tick_labels_pf

#options1 = ((2015 == zip('x15m','x15f'), (2016 == zip('x16m','x16f'))))
options = {'2015':['x15m','x15f'], '2016':['x16m','x16f'], '2017':['x17m','x17f'], '2018':['x18m','x18f'], '2019':['x19m','x19f']}
select = Select(title="Year:", align='center', value='_2019_', width=60, height=25, options=options)

callback = CustomJS(args={'source':sourceS,  'title':pm.title},code="""
        console.log(' changed selected option', cb_obj.value);

        var data = source.data;
        title.text = 'Swedish Population by Age Group ' + cb_obj.value

        // allocate column
        data['x15m'] = data[cb_obj.value];
        data['x15f'] = data[cb_obj.value];



        // register the change 
        source.change.emit()""")
pm.title.text = 'Swedish Population Breakdown by Age Group ' + select.value

select.js_on_change('value', callback)

p = gridplot([[pm, pf]], toolbar_location='right', merge_tools=True)#, toolbar_options = {'autohide':True}

layout = row(select, p, margin=5)

show(layout)