是否可以将条形图链接到带有Bokeh的饼图?

是否可以将条形图链接到带有Bokeh的饼图?,bokeh,Bokeh,我有一张图,如图所示,每列都是一天,y轴是一天中从0到24的小时数。我想将一个饼图链接到这个图,该图显示页面加载时每种颜色的细分,然后在用户拖动并选择单个列时向下过滤到用户的选择。我还没有看到一个将条形图(或散点图)链接到饼图的示例,有可能使用Bokeh吗?下面是我的图表代码,基本上是经过大量数据处理后的一堆堆叠条形图: def rig_state_breakdown(request, well_name): begin_time = datetime.datetime.now() well_i

我有一张图,如图所示,每列都是一天,y轴是一天中从0到24的小时数。我想将一个饼图链接到这个图,该图显示页面加载时每种颜色的细分,然后在用户拖动并选择单个列时向下过滤到用户的选择。我还没有看到一个将条形图(或散点图)链接到饼图的示例,有可能使用Bokeh吗?下面是我的图表代码,基本上是经过大量数据处理后的一堆堆叠条形图:

def rig_state_breakdown(request, well_name):
begin_time = datetime.datetime.now()
well_id_queryset = list(Wells.objects.filter(well_name=well_name).values('id'))
well_id = well_id_queryset[0]['id']

rig_state_data = pd.DataFrame(SentinelRigStateOutput.objects.filter(name_of_well_id=well_id).order_by('id').values())
dataframes_per_day = generate_data_for_rig_state_plots(rig_state_data)


days = []  # hours for day charts
states = []
start_times = []  # start minutes
start_times_time_format = []
names = []
operations_list = []
hole_sizes_list = []
bit_depths_list = []
hole_depths_list = []
shift_lists = []
run_status_lists = []
bha_numbers_lists = []
count = list(range(len(dataframes_per_day)))
for dataframe in dataframes_per_day:
    days.append(list(dataframe['duration_hours'].astype(float)))
    start_times_time_format.append(list(dataframe['time_of_day'].astype(str)))
    states.append(list(dataframe['rig_state_id']))
    start_times.append(list(dataframe['time_decimal'].astype(float)))
    names.append(str(dataframe['date'].iloc[0]))
    operations_list.append(list(dataframe['rig_state_string']))
    hole_sizes_list.append(list(dataframe['hole_size'].astype(float)))
    bit_depths_list.append(list(dataframe['start_bit_depth'].astype(float)))
    hole_depths_list.append(list(dataframe['start_hole_depth'].astype(float)))
    shift_lists.append(list(dataframe['shift']))
    run_status_lists.append(list(dataframe['run_status']))
    bha_numbers_lists.append(list(dataframe['bha_number'].astype(int)))

tools = "reset, box_zoom, box_select, pan, save, wheel_zoom"
tool_tips = [
    ('Operation', '@operation'),
    ('Start Time', '@time_of_day'),
    ('Duration', '@duration{0.00}mins'),
    ('Hole Size', '@hole_size{0.00}in'),
    ('Bit Depth', '@bit_depth{0}ft'),
    ('Hole Depth', '@hole_depth{0}ft'),
    ('Shift', '@shift'),
    ('Run Status', '@run_status'),
    ('BHA Number', '@bha_number'), ]
rig_state_plot = figure(title="", x_axis_label='Date', y_axis_label='Hours', tools=tools, y_range=(0, 24), sizing_mode='stretch_both', active_drag="box_select")
alpha = 0.7
number_list = list()
duration_list = list()
start_time_list = list()
top_of_bar_list = list()
state_list = list()
operation_list = list()
time_of_day_list = list()
hole_size_list = list()
bit_depth_list = list()
hole_depth_list = list()
shift_list = list()
run_status_list = list()
bha_number_list = list()
for day, state_all_day, start_time_all_day, number, operation, start_time_format, hole_sizes, bit_depths, hole_depths, shifts, run_statuses, bha_numbers in zip(days, states, start_times, count, operations_list, start_times_time_format, hole_sizes_list, bit_depths_list, hole_depths_list, shift_lists, run_status_lists, bha_numbers_lists):
    for duration, state, start_time, op, start_time_time_format, hole_size, bit_depth, hole_depth, shift, run_status, bha_number in zip(day, state_all_day, start_time_all_day, operation, start_time_format, hole_sizes, bit_depths, hole_depths, shifts, run_statuses, bha_numbers):
        number_list.append(float(number))
        duration_list.append(float(duration))
        start_time_list.append(float(start_time))
        top_of_bar_list.append(float(start_time)+float(duration))
        state_list.append(int(state))
        operation_list.append(op)
        time_of_day_list.append(start_time_time_format)
        hole_size_list.append(hole_size)
        bit_depth_list.append(bit_depth)
        hole_depth_list.append(hole_depth)
        shift_list.append(shift)
        run_status_list.append(run_status)
        bha_number_list.append(bha_number)

colors = [colordict[x] for x in state_list]
source = ColumnDataSource(data=dict(bha_number=bha_number_list, run_status=run_status_list, shift=shift_list, hole_depth=hole_depth_list, bit_depth=bit_depth_list, hole_size=hole_size_list, color=colors, number=number_list, duration=duration_list, start_time=start_time_list, top=top_of_bar_list, operation=operation_list, time_of_day=time_of_day_list))
rig_state_plot.vbar(x='number', bottom='start_time', top='top', alpha=alpha, color='color', source=source, line_width=0)
# tick label override
number_list = [int(x) for x in number_list]
rig_state_plot.xaxis.ticker = (list(set(number_list)))  # this trick will leave only the unique numbers in the list
rig_state_plot.xaxis.major_label_orientation = "vertical"
rig_state_plot.xaxis.major_label_overrides = dict(zip(list(set(number_list)), names))

rig_state_plot.yaxis.ticker = [0, 3, 6, 9, 12, 15, 18, 21, 24]
rig_state_plot.yaxis.major_label_overrides = {0: '0:00', 3: '3:00', 6: '6:00', 9: '9:00', 12: '12:00', 15: '15:00', 18: '18:00', 21: '21:00', 24: '00:00'}


# create hover tools
hover_tool = HoverTool(
    tooltips=tool_tips,
    mode='mouse',
    toggleable=False,
    )

rig_state_plot.add_tools(hover_tool)

# slider for date range
callback_date_scale = CustomJS(args=dict(x_range=rig_state_plot.x_range), code="""
    var start = cb_obj.value
    x_range.start = start[0]
    x_range.end = start[1]
""")
date_slider = RangeSlider(start=number_list[0], end=number_list[-1], value=(number_list[0], number_list[-1]), step=1, title="Date Scale", sizing_mode="stretch_width")
date_slider.js_on_change('value', callback_date_scale)

script, div = components(Column(rig_state_plot, date_slider, sizing_mode='stretch_both'))

context = {
    "wells_in_db": "active",
    'script': script,
    'div': div,
    'well_name': well_name.title(),
    'plot_type': 'Rig State Analysis',
}
print(f"code run time {datetime.datetime.now() - begin_time}")
return render(request, 'results/rig_state_analysis.html', context)