Как скрыть линию и круг на графике Python Bokeh с помощью политики щелчка легенды? - PullRequest
0 голосов
/ 28 мая 2020

У меня есть Python график боке (несколько линий графика + круг) следующим образом:

 output_notebook()

source = ColumnDataSource(da)

col_names = paises

p = figure(
 title = "A",
 x_axis_type="datetime",
 plot_width=800,
 plot_height=400,
 sizing_mode='scale_width',
 toolbar_location='above',
 tools ="box_zoom,reset,wheel_zoom" )

p_dict = dict()


for col, c, col_name in zip(da.columns, color, col_names):
 p_dict[col_name] = p.circle('date', col, source=source, color=c, size=3.5, line_width=0.5, fill_color=None)
 p_dict[col_name] = p.line('date', col, source=source, color=c, line_width=1) 

 p.add_tools(HoverTool( 
     toggleable=False,
     renderers=[p_dict[col_name]],
     tooltips=[('datetime','@date{%F}'),(col, f'@{col}')],
     formatters={'@date': 'datetime'}
 ))


legend = Legend(items=[(x, [p_dict[x]]) for x in p_dict])


p.add_layout(legend)

p.legend.click_policy="hide"

p.legend.label_text_font_size = "1vw"
p.legend.location = 'top_left'
p.left[0].formatter.use_scientific = False

show(p)

Я использую legend.click_policy="hide", чтобы скрыть линии, но при нажатии на легенду скрывает только круг но не строчку. Есть ли способ скрыть и линию, и круг?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Я понял, что мне нужно выложить полный код (я уже изменил его, чтобы вопрос был понятен). Я нашел решение, добавив легенду для l oop:

output_notebook()

source = ColumnDataSource(da)

col_names = paises

p = figure(
    title = "A",
    x_axis_type="datetime",
    plot_width=800,
    plot_height=400,
    sizing_mode='scale_width',
    toolbar_location='above',
    tools ="box_zoom,reset,wheel_zoom" )

p_dict = dict()


for col, c, col_name, leg in zip(da.columns, color, col_names, paises):
    p_dict[col_name] = p.circle('date', col, source=source, color=c, size=3.5, line_width=0.5, fill_color=None, legend_label = leg)
    p_dict[col_name] = p.line('date', col, source=source, color=c, line_width=1, legend_label = leg) 

    p.add_tools(HoverTool( 
        toggleable=False,
        renderers=[p_dict[col_name]],
        tooltips=[('datetime','@date{%F}'),(col, f'@{col}')],
        formatters={'@date': 'datetime'}
    ))


p.legend.click_policy="hide"

p.legend.label_text_font_size = "1vw"
p.legend.location = 'top_left'
p.left[0].formatter.use_scientific = False

show(p)
0 голосов
/ 28 мая 2020

Если вы можете избежать построения легенды вручную, вы можете просто предоставить функциям глифов те же legend_name:

from bokeh.io import show
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure

source = ColumnDataSource(dict(x=[0, 1, 2], y=[0, 2, 1]))

p = figure()

p.line('x', 'y', source=source, legend_label='line_with_circles')
p.circle('x', 'y', source=source, legend_label='line_with_circles')

p.legend.click_policy = "hide"
p.legend.location = 'top_left'

show(p)

Если вам нужно создать легенду вручную, просто создайте один элемент легенды и предоставить его обоими модулями рендеринга.

...