我想找到一种方法来修改全息图上的标签,他们显示的除了数值之外,还有百分比值。
例如:
import holoviews as hv
import pandas as pd
hv.extension('bokeh')
data = {'A':['XX','XY','YY','XY','XX','XX'],
'B':['RR','KK','KK','RR','RK','KK'],
'values':[10,5,8,15,19,1]}
df = pd.DataFrame(data, columns=['A','B','values'])
sankey = hv.Sankey(df)对于'From‘标签'YY’,它是'YY - 8‘,将其更改为'YY -8 (13.7%)’-在这里添加额外的百分比。
我已经找到了将绝对值更改为百分比的方法,方法如下:
value_dim = hv.Dimension('Percentage', unit='%')但是找不到在标签中同时包含两个值的方法。
此外,我还尝试修改了hover标签。在我寻找修改方法的过程中,我找到了在悬停信息中引用和显示各种属性的方法(通过bokeh工具提示),但似乎您无法操作这些信息。
发布于 2021-10-16 12:35:45
在这篇文章中,解释了两种可能的方法来实现想要的结果。让我们从示例DataFrame和必要的导入开始。
import holoviews as hv
from holoviews import opts, dim # only needed for 2. solution
import pandas as pd
data = {'A':['XX','XY','YY','XY','XX','XX'],
'B':['RR','KK','KK','RR','RK','KK'],
'values':[10,5,8,15,19,1],
}
df = pd.DataFrame(data)1. Option hv.Dimension(spec, **params),它允许您将带有关键字value_format的格式化程序应用到列名。这个格式化程序很简单,就是值和百分比值的组合。
total = df.groupby('A', sort=False)['values'].sum().sum()
def fmt(x):
return f'{x} ({round(x/total,2)}%)'
hv.Sankey(df, vdims = hv.Dimension('values', value_format=fmt))2.选项将DataFrame df扩展一列,其中存储您要使用的标签。这可以在以后通过opts(labels=dim('labels'))在Sankey中重用。要检查计算是否正确,可以启用show_values,但这将导致标签内出现重复。因此,在最终的解决方案中,show_values被设置为False。有时这可能很难找到正确的顺序。
labels = []
for item in ['A', 'B']:
grouper = df.groupby(item, sort=False)['values']
total_sum = grouper.sum().sum()
for name, group in grouper:
_sum = group.sum()
_percent = round(_sum/total_sum,2)
labels.append(f'{name} - {_sum} ({_percent}%)')
df['labels'] = labels
hv.Sankey(df).opts(show_values=False, labels=dim('labels'))此解决方案的缺点是,我们对列'A'和'B'都应用了groupby。这也是holoviews将要做的事情。所以这并不是很有效。
输出

评论
除了HoverTool不同之外,这两种解决方案产生的数字几乎相同。
https://stackoverflow.com/questions/67939221
复制相似问题