我想找到一种方法来修改 Holoviews 桑基图上显示的标签,除了数值之外,还有百分比值。
例如:
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)
对于“发件人”标签“YY”,即“YY - 8”,请将其更改为“YY - 8 (13.7%)” - 在其中添加额外的百分比。
我找到了通过使用以下内容从绝对值更改为百分比的方法:
value_dim = hv.Dimension('Percentage', unit='%')
但找不到在标签中同时包含这两个值的方法。
此外,我尝试修改悬停标签。在我寻找修改方法的过程中,我找到了在悬停信息中引用和显示各种属性的方法(通过 Bokeh 工具提示),但您似乎无法操纵此信息。
最佳答案
在这篇文章中,解释了如何实现所需结果的两种可能的方法。让我们从示例 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。选项
使用 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 不相等。
关于python - 在holoviews桑基标签或悬停信息中显示附加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67939221/