python - 在holoviews桑基标签或悬停信息中显示附加值

标签 python pandas bokeh holoviews

我想找到一种方法来修改 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' 列应用 groupbyholoviews 也能做到这一点。所以这不是很有效。

输出

Sanky with new Labels

评论

两种解决方案创建的图形几乎相同,只是 HoverTool 不相等。

关于python - 在holoviews桑基标签或悬停信息中显示附加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67939221/

相关文章:

python 3.5 的 Python OpenCV 导入错误

python - 文本数据存储方式不同

python - 在 pandas 和 numpy 中聚合 lambda 函数

python - 将处理中出现错误的所有行移动到另一个数据帧中?

javascript - 保存 Bokeh 小部件动态值

Python MySQLdb 防止 SQL 注入(inject) - 未按预期工作

python - Keras:从保存的模型中获取训练数据

python - 如何比较 2 "Friends"并查看他们是否在彼此的好友列表中?

html - 为移动 View 启用触摸滚动,Bokeh 应用程序

python - Bokeh :保存绘图(作为 HTML)但不显示