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

Plotly Sankey diagram在IPython Notebook中无图形显示,求问题排查

问题排查与修复方案

嘿,我帮你梳理了代码里的几个关键问题,正是这些导致Sankey图没显示出来,咱们一个个解决:

1. 最核心的问题:Source/Target必须是整数索引

Plotly的Sankey组件不认s1、s2这种字符串节点标识,它要求source和target必须是节点的整数索引。你得先把所有唯一节点映射成数字ID才行。

2. 节点的Label和Color数量不匹配

你的DataFrame里只给了3个标签和颜色,但实际节点有s1、s2、s3、s4共4个,数量对不上的话,Plotly没法正确渲染节点。节点的配置得对应所有唯一节点,不是和链接行一一对应哦。

3. 语法错误拖后腿

代码里多了一行孤零零的'rgba(31, 119, 180, 0.8)'],这会直接导致代码报错,肯定得删掉。


修复后的完整可运行代码

import pandas as pd
from plotly.offline import init_notebook_mode, iplot
from plotly.graph_objs import Figure, Data

# 先初始化Notebook的Plotly环境
init_notebook_mode(connected=True)

# 修正原始数据的语法错误
df = pd.DataFrame()
df['source'] = ['s1', 's2', 's3']
df['target'] = ['s2', 's3', 's4']
df['value'] = [2,2,1]
# 把链接颜色单独列出来,和节点颜色区分开
df['link_color'] = ['rgba(31, 119, 180, 0.8)', 'rgba(31, 119, 180, 0.8)', 'rgba(31, 119, 180, 0.8)']

# 生成节点到整数ID的映射:先收集所有唯一节点
all_nodes = pd.concat([df['source'], df['target']]).unique()
node_map = {node: idx for idx, node in enumerate(all_nodes)}

# 把字符串source/target转成Plotly需要的整数索引
df['source_id'] = df['source'].map(node_map)
df['target_id'] = df['target'].map(node_map)

# 配置所有节点的标签和颜色(数量要和唯一节点数一致)
node_labels = ['a', 'b', 'c', 'd']  # 对应s1、s2、s3、s4的标签
node_colors = [
    'rgba(31, 119, 180, 0.8)',
    'rgba(31, 119, 180, 0.8)',
    'rgba(31, 119, 180, 0.8)',
    'rgba(31, 119, 180, 0.8)'
]

trace1 = {
    "domain": { "x": [0, 1], "y": [0, 1] },
    "link": dict({
        "source": df['source_id'].dropna(axis=0, how='any'),
        "target": df['target_id'].dropna(axis=0, how='any'),
        "value": df['value'].dropna(axis=0, how='any'),
        "color": df['link_color'].dropna(axis=0, how='any')
    }),
    "node": dict({
        "color": node_colors,
        "label": node_labels,
        "line": { "color": "black", "width": 0.5 },
        "pad": 15,  # 把pad调大,原0.5太小会导致标签挤在一起看不见
        "thickness": 15
    }),
    "orientation": "h",
    "type": "sankey",
    "valueformat": ".0f",
    "valuesuffix": "Ha"
}

data = Data([trace1])
layout = { "font": {"size": 10}, }
fig = Figure(data=data, layout=layout)
iplot(fig, validate=False)

为啥这么改?给你划重点

  • 节点ID映射:这是Plotly Sankey的硬性要求,必须把字符串节点转成整数索引,不然组件根本不知道怎么连接节点。
  • 节点配置对齐:节点的标签和颜色数量必须等于所有唯一节点的数量,少一个都不行,否则要么节点不显示,要么渲染出错。
  • 修正语法错误:删掉那行多余的颜色字符串,不然代码连运行都通不过,更别说显示图了。
  • 优化显示效果:把pad从0.5改成15,原数值太小会让节点标签重叠或完全看不见,调大后显示更清晰。

运行这段修复后的代码,你就能在IPython Notebook里看到正常的Sankey图啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:25:40