You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 17:42:01