Jupyter Notebook中Sankey Plot无法显示,请求代码问题排查
代码问题排查与修正
核心问题点
你的代码有三个关键错误导致Sankey图无法生成:
- Plotly Sankey要求source/target是节点索引,而非字符串:你直接传入了
Source和Target的字符串值,Plotly无法识别这些节点的对应关系 - 节点标签与实际流动节点不匹配:你用
Attribute列作为节点标签,但实际流动的节点是Source和Target里的值 - 数据存在重复行:原数据里有重复的条目,会导致数值被重复计算
修正后的完整代码
import pandas as pd import plotly.graph_objects as go # 原始数据 data = [['TMD','TMD Create','Sub-Section 1',17],['TMD','TMD Create','Sub-Section 1',17],['C4C','Customer Tab','Sub-Section 1',10],['C4C','Customer Tab','Sub-Section 1',10],['C4C','Customer Tab','Sub-Section 1',17]] df = pd.DataFrame(data, columns=['Source','Target','Attribute','Value']) # 聚合重复行,避免数值重复计算 df = df.groupby(['Source', 'Target', 'Attribute'], as_index=False)['Value'].sum() # 收集所有唯一的节点(Source和Target的所有值) all_nodes = list(pd.unique(df[['Source', 'Target']].values.ravel('K'))) # 将Source和Target转换为对应的节点索引 source_indices = [all_nodes.index(s) for s in df['Source']] target_indices = [all_nodes.index(t) for t in df['Target']] # 构建Sankey的链接和节点 link = dict(source=source_indices, target=target_indices, value=df['Value'].tolist()) node = dict(label=all_nodes, pad=15, thickness=20) # 创建并显示图表 chart = go.Sankey(link=link, node=node, arrangement="snap") fig = go.Figure(chart) fig.show()
额外说明
- 聚合重复行后,TMD到TMD Create的数值会变成34,C4C到Customer Tab的数值变成37,符合实际累加逻辑
- 如果你想给不同的链接设置颜色,可以在
link里添加color参数,比如color=["#4ECDC4", "#FF6B6B"]*len(source_indices)
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

