散景:带有 MultiIndex table 的图例

Bokeh: legend with MultiIndex table

我最近刚发现 Bokeh,我尝试为一周中的每一天显示一个图例(由 'startdate_dayweek' 表示)。图例应包含每一行对应每一天的颜色。

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]

ts_list_of_list = []
for i in range(0,len(final_global_data.columns)):
    ts_list_of_list.append(final_global_data.index)

vals_list_of_list = final_global_data.values.T.tolist()

p = figure(width=500, height=300)
p.left[0].formatter.use_scientific = False
p.multi_line(ts_list_of_list, vals_list_of_list,
             legend='startdate_dayweek',
             line_color = palette,
             line_width=4)
show(p)

但是我没有图例中的预期结果:

每一天的图例如何获得?问题是因为我创建了一个 MultiIndex table 吗?谢谢

multi_line()函数可以带参数legend_fieldlegend_group。如果您将 ColumnDataSource 用作 source,则两者都适用于您的用例。请记住,如果您同时使用这两个参数,将会出现错误。

最小示例

from bokeh.plotting import figure, show, output_notebook
from bokeh.models import ColumnDataSource
output_notebook()

source = ColumnDataSource(dict(
    xs=[[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]], 
    ys=[[1,2,3,4,5],[1,1,1,1,5],[5,4,3,2,1]],
    legend =['red', 'green', 'blue'],
    line_color = ['red', 'green', 'blue']))

p = figure(width=500, height=300)
p.multi_line(xs='xs', 
             ys='ys',
             legend_field ='legend',
             line_color = 'line_color',
             source=source,
             line_width=4)
show(p)

输出