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