python - 为 Holoviews 图中的每个数据点添加文本注释

标签 python bokeh holoviews

在 Bokeh 中,我可以使用 LabelSet 以编程方式向绘图中的每个点添加文本注释。下面我给出一个简单的条形图示例:

import numpy as np
import pandas as pd

# Make some data
dat = \
(pd.DataFrame({'team':['a','b','c'], 'n_people':[10,5,12]})
    .assign(n_people_percent = lambda x: (x['n_people']/np.sum(x['n_people'])*100)
        .round(1).astype('string') + '%')
)

dat

enter image description here

# Bar plot with text annotations for every bar
from bkcharts import show, Bar
from bkcharts.attributes import CatAttr
from bokeh.models import (ColumnDataSource, LabelSet)

source_labs = ColumnDataSource(data = dat)
p = Bar(data = dat, label = CatAttr(columns = 'team'), values = 'n_people')
labels = LabelSet(x = 'team', y = 'n_people',
    text = 'n_people_percent', source = source_labs)
p.add_layout(labels)
show(p)

enter image description here

但是我不确定如何使用 Holoviews 实现同样的效果。我可以很容易地制作没有注释的相同条形图:

import holoviews as hv
hv.extension('bokeh')

p = hv.Bars(dat, kdims=['team'], vdims=['n_people'])
p

enter image description here

我可以添加一个带有 hv.Text 元素的叠加层的文本标签

p * hv.Text('a', 11, '37.0%')

enter image description here

但我不知道如何在不为每个数据点(条)单独显式调用 hv.Text 的情况下标记每个条。问题似乎是 hv.Text 不接受像其他元素一样的 data 参数,例如hv.Bars,而只是 xy 坐标。我的直觉是我应该能够做类似的事情

p * hv.Text(dat, kdims=['team'], vdims=['n_people_percent'])

如有任何帮助,我们将不胜感激!

最佳答案

看起来像这样 commit将矢量化标签添加到 hv.Labels,因此请尝试:

import holoviews as hv
hv.extension('bokeh')

p = hv.Bars(dat, kdims=['team'], vdims=['n_people'])
p * hv.Labels(dat, kdims=['team', 'n_people'], vdims=['n_people_percent'])

关于python - 为 Holoviews 图中的每个数据点添加文本注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46223037/

相关文章:

matplotlib - 如何在 HoloViews 的不同后端中实现一致的外观?

python - 为什么我的二维列表最多包含 2 个项目

python - 列增量计数器并根据其他列重置

Python - 为什么我的列表没有在此方法的范围之外进行修改?我如何修改我的代码,使其成为这样?

python - 将可视化从 Seaborn 转换为 Bokeh

javascript - 在 Bokeh 中显示裁剪后的图像

Bokeh 动态改变 BoxAnnotation

python - 在 Tkinter 中指定字体?

bokeh - 如何使用 Bokeh 在 Holoview 上将文本旋转为水平

bokeh - 强制 Holomap 渲染为 slider 而不是下拉菜单