Bokeh Legend Object - передача назначенного цвета легенде - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь создать довольно сложный круговой график боке, который имеет несколько сложных взаимодействий (изменение оси, ползунок года и другие). Я, кажется, получил это работает в основном, и без использования ColumnDataSource (потому что шаблон, который я заимствовал, не использовал его). Теперь мне нужно создать собственную легенду (или HoverTool (??)).

Мне удалось создать собственную легенду, но я не знаю, как передать цвет matplotlib, который был назначен в легенде. В настоящее время это просто легенда, показывающая все элементы легенды, но не идентификаторы цвета. Как я могу передать правильные цвета в легенду?

Вот соответствующий фрагмент моего кода:

dataframe:

FULLNAME | ES | TX | YEAR
Jim        3    12   2008
...
Tim        33    8   2009


import matplotlib
import random
from datetime import date

user_list= list(set((df["FULLNAME"])))

colordict=dict(matplotlib.colors.cnames.items())
colordict=list(colordict.values())
random_colors=random.sample(colordict,len(user_list))

def yr_slider():
    current=slider.value
    ys=df[y.value][df["YEAR"]==current].values
    p = figure(plot_width=930, plot_height=325, background_fill_color='snow', x_range=(2016,2019))
    p.circle(x=df["YEAR"][df["YEAR"]==current], y=ys, size= 20,
             color=random_colors)
    legend=Legend(items=[("Jim",random_colors[1]),
                         ("Tim",[])
                         ]) ###THIS AINT WORKIN RIGHT###
    p.add_layout(legend,'right')
    print(ys)
    return p

def update(attr, old, new):
    layout2.children[1]=yr_slider()
slider=Slider(start=2017, end=date.today().year, step=1, value=date.today().year, title="Year")
slider.on_change('value', update)

y=Select(title='X-Axis', value='ES',options=['TX','ES'])
y.on_change('value',update)

ctrls=widgetbox([y,slider], width=200)
layout2=row(ctrls,yr_slider())

curdoc().add_root(layout2)

Спасибо!

1 Ответ

0 голосов
/ 28 апреля 2018

Элементы легенды связывают метку со списком средств визуализации, а не с цветами.

legend = Legend(items=[(label,list_of_GlyphRenderers)])

Если в списке несколько глифрендеров, если они одного типа, будет отображаться только цвет первого.

Если первый использует несколько цветов, будет отображаться только первый цвет.

Если глифрендеры различного типа (например, круг и линия), то они будут объединены в маленький значок легенды.

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

Здесь у вас есть только один рендерер circle(), но с разными цветами, поэтому будет использоваться только первый цвет. Я не знаю, как напрямую настроить значки легенд.

Вы можете сделать отдельный звонок в Круг для каждой точки

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

names = ["Jim","Bob","Assia"]
colors = ["red","blue","green"]

fig = figure()
items = []
for i in range(3):
    items += [(names[i],[fig.circle(i,i,color=colors[i],size=20)])]
fig.add_layout(Legend(items=items),'right')
show(fig)

Но использование Hovertool, вероятно, лучше, если у вас много точек.

...