Благодаря Юджину я был на пути просветления и смог получить диаграмму, как я хотел. Мне пришлось изменить расчет положения меток путем вычисления середины между начальным углом и конечным углом сектора «пончика», потому что я хотел, чтобы метки были в середине каждого клина.
Я изменил пример Eugenes к этому, где «num» - это просто значение, которое я использую для вычисления относительной ширины каждого year_wedge (Eugene использует «value» в своем примере, я использую num для занятого числа слотов каждого клина в общей сложности) ширина слотов на «пончик», я надеюсь, это достаточно ясно):
R = 3
gics_sector_data= gics_sector_data.assign(
end_angle=lambda d: np.cumsum(d['num'] / d['num'].sum() * 2 * pi),
start_angle=lambda d: np.pad(d['end_angle'], (1, 0))[:-1],
label_x=lambda d: R* 1.00 * np.cos(((d['end_angle']-d['start_angle'])/2)+d['start_angle']),
label_y=lambda d: R* 1.00 * np.sin(((d['end_angle']-d['start_angle'])/2)+d['start_angle']),
label_angle=lambda d: (((d['end_angle']-d['start_angle'])/2)+d['start_angle']))
Что-то о умножении 1,00, вы можете переместить метки от внешнего края клина, например, используя 0,95.
Что-то в стороне: я сократил имена меток, добавив столбец label_shortname, потому что bokeh не может выравнивать метки строк. Короткое имя будет использоваться для меток, длинное имя для всплывающей подсказки:
gics_sector_data['gics_name_short'] = gics_sector_data['gics_name'].str.slice(stop=20)
, а затем нарисует year_wedge, как с start_angles и end_anglescalculated:
# Sector Ring
p.annular_wedge(x=0, y=0, inner_radius=gics_sector_radius-ringWidth, outer_radius=gics_sector_radius,
start_angle='start_angle', end_angle='end_angle',
line_color="white", fill_color='color', source=gics_sector_data)
и, наконец, нарисует LabelSet с вычисленными метками label_x, label_y и label_angle, которые будут рисовать метку в середине клина, text_baseline = 'middle', обязателен для достижения хорошего результата:
sourceSector = ColumnDataSource(gics_sector_data)
labelsSector = LabelSet(x='label_x', y='label_y', text='gics_name_short',
angle='label_angle', source=sourceSector, render_mode='canvas',
text_font_size="7pt", text_align='right', text_baseline='middle')
p.add_layout(labelsSector)
и здесь идеальный результат 99,999% График результатов GICS bokeh , надеюсь, это поможет создать похожие диаграммы