Plotly Sankey: Mengapa node salah tempat?
(Plotly 4.10.0, Python 3.8.0, Ubuntu 20.04)
Saya bekerja dengan Plotly Sankeys, tetapi penempatan otomatis terlihat cukup bermasalah (sayangnya saya tidak dapat menempatkan node secara manual).
import plotly.graph_objects as go
sources = [ 0, 0, 1, 1, 2, 2]
targets = [ 1, 2, 3, 4, 5, 6]
values = [45, 30, 15, 30, 20, 10]
labels = ['Node 0', 'Node 1', 'Node 2', 'Node 3', 'Node 4', 'Node 5', 'Node 6']
link = dict(source=sources, target=targets, value=values)
node = dict(label=labels)
data = go.Sankey(link=link, node=node)
fig = go.Figure(data)
fig.show(renderer="svg", width=1000, height=500)
menghasilkan
Mengapa Node 3 salah tempat, dan tidak bersama-sama dengan Node 4? Node tidak ditempatkan sesuai dengan nilai yang diurutkan, jika Node 3 harus berada di bawah Node 6 .
Hanya mengubah dari 15 menjadi 16 bobot Node1-> 3 penempatan sudah benar:
values = [46, 30, 16, 30, 20, 10]
menghasilkan:
Apakah saya melewatkan sesuatu di sini?
-----------------------------------------
EDIT: Apakah node_pad pelakunya?
Asli
values = [45, 30, 15, 30, 20, 10]
...
data = go.Sankey(link=link, node=node)
mengembalikan penempatan yang salah.
data = go.Sankey(link=link, node=node, node_pad=9) memecahkan masalah.
Dengan data = go.Sankey(link=link, node=node, node_pad=10)itu terwujud lagi.
Sepertinya ada bug dalam perhitungan. Saya akan membuka masalah.
Jawaban
Saya tidak dapat mereproduksi masalah ini, jadi tebakan saya adalah pembaruan terbaru untuk Plotly v4.10.0mungkin telah memperbaiki bug ini.
import plotly.graph_objects as go
sources = [0, 0, 1, 1, 2, 2] #indices correspond to labels
targets = [1, 2, 3, 4, 5, 6]
values = [45, 30, 15, 30, 20, 10]
labels = ['Node 0', 'Node 1', 'Node 2', 'Node 3', 'Node 4', 'Node 5', 'Node 6']
link = dict(source=sources, target=targets, value=values)
node = dict(label=labels)
data = go.Sankey(link=link, node=node)
fig = go.Figure(data)
fig.show()
# fig.show(renderer="svg", width=1000, height=500)
Jika saya secara drastis mengubah beberapa nilai, seperti yang Anda katakan, kita seharusnya tidak mengharapkan penempatan node berubah. values = [20, 30, 25, 30, 20, 10]tidak mengubah penempatan node untuk saya: