我是bokeh的新手,并且想使用bokeh形状绘制饼图。
我使用https://docs.bokeh.org/en/latest/docs/gallery/pie_chart.html中的引用来创建我的饼形图。
现在,我需要在饼图的每个部分上添加一个标签,该标签代表该部分的百分比,并且标签位置应与中心对齐。
我找不到通过文档完成此操作的简单方法,并尝试找到手动执行此操作的方法,例如以下示例:Adding labels in pie chart wedge in bokeh
我试图创建一个标签集并将布局添加到绘图中,但是我不知道是否有一种方法可以控制标签的位置,大小和字体。 text_align(右,左,中)对我而言不起作用。
这是我的代码-此函数创建并返回饼图的html图表参数包含图表的相关数据。在这种情况下,它是一个元组(大小为1),并且series [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)
这是结果:pie chart consist of 3 parts
在2个示例中-系列标题为'kuku'第一个示例的x和y值:x = [“ A”,“ B”,“ C”]y = [10,20,30]
第二个例子:x = [“ A”,“ B”,“ C”,“ D”,“ E”,“ F”,“ G”,“ H”,“ I”]y = [10,20,30,100,90,80,70,60,30,40,50]
我知道过去我可以用Donut轻松做到这一点,但已弃用。我希望能够得到这样的东西:example1或这样:example2
据您所知,问题在这里:
labels = LabelSet(x=0, y=1, text='percentage', level='glyph', angle=cumsum('angle', include_zero=True), source=source, render_mode='canvas')
在Bokeh中创建标签有点混乱,但是仍然:您应该为绘制的每一行添加“ text_pos_x”和“ text_pos_y”之类的列,并在其中放置您要放置文本的坐标。然后将其应用到LabelSet函数中,得到x ='text_pos_x'和y ='text_pos_y',以便绘图的每个部分都有自己的坐标来放置标签:
labels = LabelSet(x='text_pos_x', y='text_pos_y', text='percentage', level='glyph', angle=0, source=source, render_mode='canvas')
并且是的,有必要将angle设置为0以避免文本旋转。