Я новичок в боке и хочу сделать круговую диаграмму, используя фигуру боке.
Я использовал ссылку из https://bokeh.pydata.org/en/latest/docs/gallery/pie_chart.html для создания фигуры круговой диаграммы.
Теперь мне нужно добавить на каждую часть круговой диаграммы метку, которая представляет процент этой части, и положение метки должно быть выровнено по центру.
Я не смог найти простой способ сделать это с помощью документации, и попытался найти способы сделать это вручную, как в следующем примере: Добавление меток в клин круговой диаграммы в боке
Я пытался создать набор меток и добавить макет к графику, но не мог понять, есть ли способ контролировать положение, размер и шрифт метки. text_align (справа, слева, по центру) не выполняет эту работу за меня.
Вот мой код - эта функция создает и возвращает HTML круговой диаграммы
Аргумент диаграммы содержит соответствующие данные для диаграммы. в этом случае это кортеж (размер 1), а серия [0] содержит имя серии (series.title), список значений x (series.x) и список значений y (series.y)
def render_piechart(self, chart):
"""
Renders PieChart object using Bokeh
:param chart: Pie chart
:return:
"""
series = chart.series[0]
data_dict = dict(zip(series.x, series.y))
data = pd.Series(data_dict).reset_index(name='value').rename(columns={'index': 'Category'})
data['angle'] = data['value'] / data['value'].sum() * 2 * pi
data['color'] = palette[:len(series.x)]
data['percentage'] = data['value'] / data['value'].sum() * 100
data['percentage'] = data['percentage'].apply(lambda x: str(round(x, 2)) + '%')
TOOLTIPS = [('Category', '@Category'), ('Value', '@value'), ('Percentage', '@percentage')]
fig = figure(title=series.title,
plot_width=400 if chart.sizehint == 'medium' else 600,
plot_height=350 if chart.sizehint == 'medium' else 450,
tools='hover', tooltips=TOOLTIPS, x_range=(-0.5, 1.0))
fig.wedge(x=0, y=1, radius=0.45, start_angle=cumsum('angle', include_zero=True),
end_angle=cumsum('angle'), line_color='white', fill_color='color',
legend='Category', source=data)
fig.title.text_font_size = '20pt'
source = ColumnDataSource(data)
labels = LabelSet(x=0, y=1, text='percentage', level='glyph', angle=cumsum('angle', include_zero=True),
source=source, render_mode='canvas')
fig.add_layout(labels)
fig.axis.axis_label = None
fig.axis.visible = False
fig.grid.grid_line_color = None
return bokeh.embed.file_html(fig, bokeh.resources.CDN)
И вот результаты:
круговая диаграмма состоит из 3 частей
круговая диаграмма состоит из 10 частей
в 2 примерах - название серии 'kuku'
значения x и y для первого примера:
x = ["A", "B", "C"]
у = [10, 20, 30]
и для второго примера:
x = ["A", "B", "C", "D", "E", "F", "G", "H", "I"]
у = [10, 20, 30, 100, 90, 80, 70, 60, 30, 40, 50]
Я знаю, что в прошлом я мог легко сделать это с Пончиком, но это устарело.
Я хочу иметь возможность получить что-то вроде этого:
example1
или это: пример2