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
相关产品推荐
相关产品推荐

