Bokeh使用MultiIndex表格时如何生成每周各天对应图例
问题原因
- 第一个问题确实和你生成的MultiIndex表格有关:
pivot操作后final_global_data的列是二级多级索引,第一级为你聚合的数值字段名,第二级才是startdate_dayweek的具体取值,直接给multi_line传legend='startdate_dayweek'无法匹配到正确的标签值。 - 第二个问题是
multi_line方法本身的限制:它仅支持为所有绘制的折线绑定同一个图例标签,无法自动为每一条折线生成独立的、对应不同标签的图例项,所以就算没有MultiIndex问题,用这个方法也达不到你要的效果。
修复代码
import pandas as pd from bokeh.plotting import figure, show from bokeh.io import output_file from bokeh.palettes import Set1_7 output_file("conso_daily.html") treatcriteria_data_global = pd.read_csv(r"treatcriteria_evolution.csv", sep=';') final_global_data = treatcriteria_data_global.groupby(['startdate_weekyear','startdate_dayweek'],as_index = False).sum().pivot('startdate_weekyear','startdate_dayweek').fillna(0) numlines = len(final_global_data.columns) palette = Set1_7[0:numlines] # 提取正确的星期几标签,从MultiIndex的第二级取值 day_labels = final_global_data.columns.get_level_values('startdate_dayweek').tolist() # 提取X轴(周数) x = final_global_data.index p = figure(width=500, height=300) p.left[0].formatter.use_scientific = False # 循环单独绘制每天的折线,单独指定图例和颜色 for day_idx in range(numlines): # 取对应天的Y值 y = final_global_data.iloc[:, day_idx] p.line(x, y, legend_label=str(day_labels[day_idx]), line_color=palette[day_idx], line_width=4) # 可选:添加点击图例隐藏对应折线的交互 p.legend.click_policy = "hide" show(p)
效果说明
修改后每条折线会和对应星期几的标签、颜色一一绑定,自动生成符合预期的图例。
内容的提问来源于stack exchange,提问作者Rinnosuke
相关产品推荐
相关产品推荐

