Как добавить одну легенду, которая управляет несколькими фигурами боке? - PullRequest
0 голосов
/ 30 июня 2019

как создать одну легенду для управления несколькими фигурами боке? Или как настроить экспортированный html-файл, созданный с помощью bokeh, чтобы добавить легенду с похожими функциями?

Вот сценарий. Я создаю HTML-файл с 4 различными фигурами. Каждая фигура имеет легенду с метками / именами для отдельных линий, которые показаны на конкретной фигуре. Каждая из четырех легенд доступна для переключения линий отдельно на каждой фигуре.

Хотя каждая из четырех фигур имеет одну легенду, линии связаны между собой, поэтому каждая строка описывает одну вещь.

Теперь я хочу создать легенду для всех фигур, объединенных в одну, для переключения каждой строки на всех четырех фигурах.

Может быть, есть какой-нибудь способ добавить такую ​​функцию в экспортированный html-файл?

Я думал, что у кого-то с большим опытом есть идея, как этого достичь.

Заранее спасибо!

С уважением

1 Ответ

1 голос
/ 30 июня 2019

Легенды не являются (пока?) «Автономными» моделями боке, их нужно прикрепить к фигуре. На данный момент, чтобы иметь внешнюю легенду для нескольких фигур и разместить ее в любом месте макета, необходим некоторый обходной путь.

Обычно я делаю это, как показано ниже, с «невидимой» фигурой, содержащей общую легенду. Затем вам нужно определить элементы легенды вручную и назначить каждому их ярлык и список средств визуализации.

from bokeh.io import show
from bokeh.plotting import figure
from bokeh.models import LegendItem, Legend
from numpy.random import random, choice
from bokeh.layouts import gridplot
from webcolors import html4_names_to_hex

del html4_names_to_hex['white']
palette = list(html4_names_to_hex.keys())

fig_list = [figure(plot_width=300,plot_height=300) for i in range(4)]

renderer_list = []
color_list = []
for fig in fig_list:
    for i in range(5):
        color = choice(palette)
        renderer = fig.line(range(10),random(10),line_width=2,color=color)
        renderer_list += [renderer]
        color_list += [color]

# Lines with the same color will share a same legend item
legend_items = [LegendItem(label=color,renderers=[renderer for renderer in renderer_list if renderer.glyph.line_color==color]) for color in set(color_list)]

## Use a dummy figure for the LEGEND
dum_fig = figure(plot_width=300,plot_height=600,outline_line_alpha=0,toolbar_location=None)
# set the components of the figure invisible
for fig_component in [dum_fig.grid[0],dum_fig.ygrid[0],dum_fig.xaxis[0],dum_fig.yaxis[0]]:
    fig_component.visible = False
# The glyphs referred by the legend need to be present in the figure that holds the legend, so we must add them to the figure renderers
dum_fig.renderers += renderer_list
# set the figure range outside of the range of all glyphs
dum_fig.x_range.end = 1005
dum_fig.x_range.start = 1000
# add the legend
dum_fig.add_layout( Legend(click_policy='hide',location='top_left',border_line_alpha=0,items=legend_items) )

figrid = gridplot(fig_list,ncols=2,toolbar_location='left')
final = gridplot([[figrid,dum_fig]],toolbar_location=None)
show(final)
...