在Holoviews绘图中对每个数据点添加文本注释

4
在 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)

这里输入图片描述

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

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

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

我可以使用hv.Text元素添加一个覆盖层来添加单个文本标签。

输入图像描述

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

enter image description here

但是我不知道如何为每个条形图添加标签,而不必显式地为每个数据点(条形)单独调用hv.Text。问题似乎在于hv.Text不像其他元素(例如hv.Bars)一样接受data参数,只接受xy坐标。我的直觉是我应该能够做出类似以下的操作:

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

任何对此有帮助的支持都会受到感激!

1
我们还没有添加矢量化文本元素,但这很容易实现。关于此事有一些讨论在这里,其中包括一个实现此类元素的链接。目前,您可以简单地创建多个常规文本元素的叠加层。 - philippjfr
1个回答

5

看起来这个 commithv.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'])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接