如何在Python Plotly桑基图中显示无出入流的孤立节点
解决Plotly桑基图孤立节点不显示的问题
Plotly Sankey默认会自动隐藏没有任何流入/流出连接的节点(比如你的A3),要让这类孤立节点显示,最可靠的方式是给它添加一条自循环的空连接,同时可以自定义它的厚度与位置。
修改后的完整代码
import plotly.graph_objects as go fig = go.Figure(data=[go.Sankey( node = dict( pad = 15, # 给每个节点单独设置厚度,A3对应索引6,可自定义数值 thickness = [20, 20, 20, 20, 20, 20, 30], line = dict(color = "black", width = 0.5), label = ["A1", "A2", "B1", "B2", "C1", "C2", "A3"], color = ["blue"]*6 + ["orange"], # 给A3单独设色方便区分 # 可选:手动定位A3的位置,x/y范围0-1,避免和其他节点重叠 x = [0, 0, 0.5, 0.5, 1, 1, 0], y = [0.8, 0.6, 0.8, 0.6, 0.8, 0.6, 0.2] ), link = dict( source = [0, 1, 0, 2, 3, 3, 6], # 加入A3的索引作为source target = [2, 3, 3, 4, 4, 5, 6], # 加入A3的索引作为target(自循环) value = [8, 4, 2, 8, 4, 2, 0] # 自循环value设为0,不会显示连线 ))]) fig.update_layout(title_text="包含孤立节点的桑基图", font_size=12) fig.show()
关键细节说明
- 自循环空连接:给孤立节点添加一条
source和target均为自身、value=0的连接,Plotly会识别到节点存在,且因为value为0不会显示多余连线。 - 自定义厚度:将
thickness从单一数值改为列表,对应每个节点的厚度,比如A3(索引6)设为30,其他节点保持20。 - 手动定位:通过
node.x和node.y可精准控制孤立节点的位置,x=0对应左列、x=1对应右列,y控制垂直位置,避免与其他节点重叠。
替代方案(无需添加连接)
如果不想添加自循环连接,可通过强制设置node.x和node.y的方式显示孤立节点,但这种方式在部分Plotly版本中稳定性稍差:
import plotly.graph_objects as go fig = go.Figure(data=[go.Sankey( node = dict( pad = 15, thickness = [20,20,20,20,20,20,30], line = dict(color = "black", width = 0.5), label = ["A1", "A2", "B1", "B2", "C1", "C2", "A3"], color = ["blue"]*6 + ["orange"], # 强制指定所有节点的位置,包括A3 x = [0,0,0.5,0.5,1,1,0], y = [0.8,0.6,0.8,0.6,0.8,0.6,0.2], hoverinfo='all' # 确保节点可交互 ), link = dict( source = [0,1,0,2,3,3], target = [2,3,3,4,4,5], value = [8,4,2,8,4,2] ))]) fig.show()
内容的提问来源于stack exchange,提问作者krcoder
相关产品推荐
相关产品推荐

