You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Holoviews生成Sankey图报错「仅支持无环图」问题求助

报错原因

Holoviews 内置的 Sankey 组件仅支持无环有向图结构,你当前的数据存在两类不符合要求的链路:

  • 自环链路:存在 a 列值等于 b 列值的行,比如行0的0→0、行4的1→1、行11的3→3,节点指向自身的结构属于环
  • 循环链路:存在跨节点的循环路径,比如0→2→0、1→0→1、3→4→3这类首尾闭合的链路,也会被识别为环

解决方法

方法1:清洗数据+节点分层(适配Holoviews Sankey)

如果你的a列和b列本身对应桑基图的两个独立层级,只需要给不同层级的节点加标识前缀,避免节点ID混用产生循环判定,同时过滤自环即可:

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

# 过滤自环
df_clean = df_test2[df_test2['a'] != df_test2['b']].copy()
# 给不同层级的节点加前缀,区分第一层和第二层节点
df_clean['a'] = '层级1_' + df_clean['a'].astype(str)
df_clean['b'] = '层级2_' + df_clean['b'].astype(str)

# 正常生成桑基图
hv.Sankey(df_clean, kdims=["a","b"], vdims=["v"])

方法2:改用支持有环图的Plotly Sankey

如果业务需要保留自环、循环链路,可以直接使用Plotly原生的桑基图组件,它不限制无环要求:

import plotly.graph_objects as go
import pandas as pd

# 生成节点ID映射
all_nodes = pd.concat([df_test2['a'], df_test2['b']]).unique()
node_id_map = {val: idx for idx, val in enumerate(all_nodes)}

# 构造桑基图需要的源、目标、权重数组
source = df_test2['a'].map(node_id_map).tolist()
target = df_test2['b'].map(node_id_map).tolist()
value = df_test2['v'].tolist()

# 绘制图形
fig = go.Figure(go.Sankey(
    node=dict(
        pad=15,
        thickness=20,
        label=list(node_id_map.keys())
    ),
    link=dict(
        source=source,
        target=target,
        value=value
    )
))
fig.show()

内容的提问来源于stack exchange,提问作者user9364978

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:09:04