我正在尝试使用带有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)
最后,我得到以下结果:
有解决的主意吗?我发现了其他相关问题(例如matplotlib),但不是bokeh。
我认为这会起作用:
lkup = {x.label['value']: x for x in p.legend.items}
p.legend.items.clear()
for itm in lkup.values():
p.legend.items.append(itm)