Дублированные надписи на легенде на боке - PullRequest
1 голос
/ 30 января 2020

Я пытаюсь отобразить качественные данные, используя кольцевой график с библиотекой bokeh. У меня есть 2 набора данных, совместно использующих некоторые метки данных, и я хочу иметь объединенную легенду, объединяющую обе метки.

Мне удалось либо показать легенду только для одного графика, либо иметь ее для обоих, но с повторяющимися элементами , Однако я не нашел способа иметь уникальные записи. Вот пример кода, чтобы показать мою проблему:

from math import pi
import pandas as pd
from bokeh.io import show
from bokeh.plotting import figure
from bokeh.transform import cumsum
from bokeh.palettes import Set3

# Create fake data
df = pd.DataFrame(
    {'label': ['X{}'.format(i) for i in range(0, 4)] + ['X{}'.format(i) for i in range(2, 8)],
     'angle': [2*pi / 4] * 4 + [2*pi / 6] * 6,
     'group': [1]*4 + [2]*6})

# Set up colors
unique_labels = df.label.unique()
color_mapping = pd.Series(dict(zip(unique_labels, Set3[len(unique_labels)])))
df['color'] = color_mapping.loc[df.label].values

# Plot two concentric donuts
p = figure(title='Test', tools="hover", tooltips="@label")

p.annular_wedge(source=df[df.group==1], x=0, y=1, inner_radius=0.5, outer_radius=0.6,
                start_angle=cumsum('angle', include_zero=True), end_angle=cumsum('angle'),
                line_color="white", fill_color='color', legend_group='label')

p.annular_wedge(source=df[df.group==2], x=0, y=1, inner_radius=0.3, outer_radius=0.4,
                start_angle=cumsum('angle', include_zero=True), end_angle=cumsum('angle'),
                line_color="white", fill_color='color', legend_group='label')
show(p)

В конце я получаю следующий результат:

enter image description here

Любая идея, чтобы решить это? Я нашел другие связанные вопросы (например, matplotlib), но не для боке.

1 Ответ

2 голосов
/ 30 января 2020

Я думаю, что это сработает:

legend_tmp = {x.label['value']: x for x in p.legend.items}
p.legend.items.clear()
p.legend.items.extend(legend_tmp.values())

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

...