英文:
Draw Sankey diagram with holoviews and Bokeh
问题
如何使用这些数据绘制以下桑基图:
| 源 | 目标 | 数值 | 类别链接 |
|---|---|---|---|
| 22 SPHYRNIDAE | CE | 3 | 极度濒危 |
| 27 TRIAKIDAE | CE | 5 | 极度濒危 |
| 67 DASYATIDAE | CE | 2 | 极度濒危 |
| 14 CARCHARHINIDAE | CE | 4 | 极度濒危 |
| 62 UROTRYGONIDAE | CE | 2 | 极度濒危 |
英文:
How can I draw the following Sankey diagram with this data
| Source | Target | Value | Category_links |
|---|---|---|---|
| 22 SPHYRNIDAE | CE | 3 | Critically Endangered |
| 27 TRIAKIDAE | CE | 5 | Critically Endangered |
| 67 DASYATIDAE | CE | 2 | Critically Endangered |
| 14 CARCHARHINIDAE | CE | 4 | Critically Endangered |
| 62 UROTRYGONIDAE | CE | 2 | Critically Endangered |
答案1
得分: 1
最简单的方法是使用 pandas DataFrame。您的表格看起来非常接近所需的形式。然后使用此 DataFrame 调用 hv.Sankey()。
import pandas as pd
import holoviews as hv
hv.extension('bokeh')
df = pd.DataFrame({
'Source':['SPHYRNIDAE', 'TRIAKIDAE', 'DASYATIDAE','CARCHARHINIDAE', 'UROTRYGONIDAE'],
'Target':['CE']*5,
'Value': [3,5,2,4,2]
})
上面代码的输出如下图所示:

要为边缘添加颜色,请在 DataFrame 中添加一个包含颜色信息(颜色字符串或十六进制字符串)的列,并将列名传递给 opts() 调用中的 edge_color 参数。
df = pd.DataFrame({
'Source':['SPHYRNIDAE', 'TRIAKIDAE', 'DASYATIDAE','CARCHARHINIDAE', 'UROTRYGONIDAE'],
'Target':['CE']*5,
'Value': [3,5,2,4,2],
'EdgeColor': ['blue', 'red', 'black', 'orange', 'magenta']
})
sankey = hv.Sankey(df)
sankey.opts(width=600, height=400, edge_color='EdgeColor')
带有彩色边缘的输出如下图所示:

或者使用节点的默认颜色,并将其传递给边缘。要使用左节点的颜色,请将源的列名传递给 hv.dim().str()。要使用目标节点的颜色,请将目标的列名传递给 hv.dim().str()。
sankey = hv.Sankey(df)
sankey.opts(width=600, height=400, edge_color=hv.dim('Source').str())
# sankey.opts(width=600, height=400, edge_color=hv.dim('Target').str())
节点颜色决定边缘颜色的输出如下图所示:

评论
此代码在 bokeh 3.1.1、panel 1.0.2 和 holoviews 1.16.0 下运行。
参考链接
https://holoviews.org/reference/elements/matplotlib/Sankey.html#sankey
英文:
The easiest way is to have a pandas DataFrame. Your table looks very close to the wanted from. Then call hv.Sankey() with this DataFrame.
import pandas as pd
import holoviews as hv
hv.extension('bokeh')
df = pd.DataFrame({
'Source':['SPHYRNIDAE', 'TRIAKIDAE', 'DASYATIDAE',' CARCHARHINIDAE', 'UROTRYGONIDAE'],
'Target':['CE']*5,
'Value': [3,5,2,4,2]
})
>>> Source Target Value
0 SPHYRNIDAE CE 3
1 TRIAKIDAE CE 5
2 DASYATIDAE CE 2
3 CARCHARHINIDAE CE 4
4 UROTRYGONIDAE CE 2
sankey = hv.Sankey(df)
sankey.opts(width=600, height=400)
The Output of the code above is
To style the edges with a color add a column with color information (color string or hex string) to the DataFrame and pass the column name to the parameter edge_color in the ops() call.
df = pd.DataFrame({
'Source':['SPHYRNIDAE', 'TRIAKIDAE', 'DASYATIDAE',' CARCHARHINIDAE', 'UROTRYGONIDAE'],
'Target':['CE']*5,
'Value': [3,5,2,4,2],
'EdgeColor': ['blue', 'red', 'black', 'orange', 'magenta']
})
sankey = hv.Sankey(df)
sankey.opts(width=600, height=400, edge_color='EdgeColor')
Or use the default colors from the nodes and pass them to the edges. To use the color from the left node, pass the column name of the source to hv.dim().str(). To use the color of the target node, pass the column name of the traget to hv.dim().str().
sankey = hv.Sankey(df)
sankey.opts(width=600, height=400, edge_color=hv.dim('Source').str())
# sankey.opts(width=600, height=400, edge_color=hv.dim('Target').str())
Comment
This code was run with bokeh 3.1.1, panel 1.0.2 and holoviews 1.16.0
References
https://holoviews.org/reference/elements/matplotlib/Sankey.html#sankey
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论