簡體   English   中英

Python plotly sankey 並確定節點的順序

[英]Python plotly sankey and determine the order of the nodes

我正在繪制一個桑基圖,其中值從 1 個開始節點到 5 個音符(A、B、C、D 和 E)。 我希望按字母順序繪制節點,我認為這可以通過我的代碼來實現,但正如您從運行我的代碼中看到的那樣,情況並非如此 - 我如何確保 A 后跟 B 和 B其次是C等?

我有 Python 3.9 並有計划地更新到 4.12.0 版,但它沒有幫助。 我在 Jupyter notebook 和 Spyder (4.15) 中都運行了代碼,但是節點的順序是關閉的 - 你能建議我如何在代碼中指定順序嗎?

import plotly.graph_objects as go
import plotly.express as px

source = [0, 0, 0, 0, 0]

target = [1, 2, 3, 4, 5]


value = [356, 16, 39, 6, 88]

label = ['Start', 'A', 'B', 'C', 'D', 'E']


color_node = ['#EBBAB5', 
'#EBBAB5', '#FEF3C7', '#A6E3D7','#98FB98', '#DDA0DD','#EBBAB5', '#FEF3C7', '#A6E3D7','#98FB98', '#DDA0DD','#EBBAB5', '#FEF3C7', '#A6E3D7','#98FB98', '#DDA0DD','#EBBAB5', '#FEF3C7', '#A6E3D7','#98FB98', '#DDA0DD','#EBBAB5', '#FEF3C7', '#A6E3D7','#98FB98', '#DDA0DD']
color_link = ['#EBBAB5', '#FEF3C7', '#A6E3D7','#98FB98', '#DDA0DD', 
'#EBBAB5', '#FEF3C7', '#A6E3D7','#98FB98', '#DDA0DD','#EBBAB5', '#FEF3C7', '#A6E3D7','#98FB98', '#DDA0DD','#EBBAB5', '#FEF3C7', '#A6E3D7','#98FB98', '#DDA0DD','#EBBAB5', '#FEF3C7', '#A6E3D7','#98FB98', '#DDA0DD','#EBBAB5', '#FEF3C7', '#A6E3D7','#98FB98', '#DDA0DD']

link = dict(source=source, target=target, value = value, color = color_link)
node = dict(label = label, pad=30, thickness=5, color = color_node)


data = go.Sankey(link = link, node = node)
fig = go.Figure(data)
fig.show()

您可以利用 此功能

例如,這可以解決問題,盡管它相當手動:

n = 1/4
link = dict(source=source, target=target, value = value, color = color_link)
node = dict(label = label, 
            x = [0, 1, 1, 1, 1, 1],
            y = [0, 0*n, 1*n, 2*n, 3*n, 4*n],
            pad=30, 
            thickness=5, 
            color = color_node)

data = go.Sankey(
    link = link, 
    node = node,
    arrangement = "snap", 
)
fig = go.Figure(data)
fig.show()

我所做的只是指定節點的位置:第一列x==0 ,第二列x==1 對於y ,我對第二列中的節點使用了 0 和 1 之間的偶數間距。 我預計會有一些節點重疊,但似乎 plotly.js 中的邏輯為您解決了這個問題。

您可以通過指定兩個標簽列表以編程方式完成此技巧:

label_l = ['Start', ]
label_r = [ 'A', 'B', 'C', 'D', 'E']
...
node = dict(label = label_l + label_r, 
            x = [0, ]*len(label_l) + [1,]*len(label_r),
            y = list(np.linspace(0,1,len(label_l))) + list(np.linspace(0,1,len(label_r))),
            pad=30, 
            thickness=5, 
            color = color_node)

但是,我不保證它適用於更復雜的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM