python-3.x - 向散景饼图楔形添加标签
问题描述
我是散景新手,想使用散景图渲染饼图。
我使用来自https://docs.bokeh.org/en/latest/docs/gallery/pie_chart.html的参考来创建我的饼图。
现在,我需要在饼图的每个部分上添加一个标签,表示该部分的百分比,并且标签位置应该与中心对齐。
我无法通过文档找到一种简单的方法,并尝试找到手动操作的方法,例如以下示例:在散景中添加饼图楔形标签
我试图创建一个标签集并将布局添加到绘图中,但我不知道是否有办法控制标签位置、大小和字体。text_align (right, left, center) 不适合我。
这是我的代码 - 此函数创建并返回饼图的 html chart 参数包含图表的相关数据。在这种情况下,它是一个元组(大小为 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)
这是结果: 饼图由 3 部分组成
在 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 以避免文本被旋转。
推荐阅读
- javascript - 只有 href="#",没有 onclick(),如何在脚本中加载它?
- node.js - 将 SSL (PORT 443) 添加到 Nginx 反向代理服务器 (PORT 80) - Nginx 配置文件
- web-component - 当使用 webcomponents-loader 而不是 webcomponents-lite
- c# - xamarin forms - bind TapGestureRecognizer to code-behind rather than view model
- python - 更新 PyTorch 中的特定向量元素
- javascript - 在Angular 6中的更多字段之后过滤管道
- html - Bootstrap 4 导航栏链接不可见,但出现导航栏品牌
- python - 使用python 3.4的用户名和密码程序
- python - 脚本 Python 连接并运行查询 RMAN (ORACLE) 命令
- ios - 如何使用swift 4在ios中使用Material Components实现多行文本字段