Plotly:如何在桑基图中设置节点位置?
Plotly: How to set node positions in a Sankey Diagram?
样本数据如下:
unique_list = ['home0', 'page_a0', 'page_b0', 'page_a1', 'page_b1',
'page_c1', 'page_b2', 'page_a2', 'page_c2', 'page_c3']
sources = [0, 0, 1, 2, 2, 3, 3, 4, 4, 7, 6]
targets = [3, 4, 4, 3, 5, 6, 8, 7, 8, 9, 9]
values = [2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2]
中的示例代码
fig = go.Figure(data=[go.Sankey(
node = dict(
pad = 15,
thickness = 20,
line = dict(color = "black", width = 0.5),
label = unique_list,
color = "blue"
),
link = dict(
source = sources,
target = targets,
value = values
))])
fig.show()
这将输出以下桑基图
但是,我想获得 在同一垂直列中以相同数字结尾的所有值,就像最左边的列的所有节点都以a 0. 我在 docs 中看到可以移动节点位置,但是我想知道除了手动输入 x 和 y 值之外是否有更简洁的方法来完成此操作。任何帮助表示赞赏。
在go.Sankey()
中设置arrangement='snap'
并调整x=<list>
和y=<list>
中的x和y位置。以下设置将根据要求放置您的节点。
剧情:
请注意,此示例中未明确设置 y 值。一旦同一 x 值有多个节点,y 值将自动调整以使所有节点显示在同一垂直位置。如果您确实想要明确设置所有位置,只需设置arrangement='fixed'
编辑:
我添加了一个自定义函数 nodify()
,它将相同的 x 位置分配给具有共同结尾的标签名称,例如 ['home0', 'page_a0', 'page_b0']
中的 '0'
。现在,如果您将 page_c1
更改为 page_c2
作为示例,您将得到:
完整代码:
import plotly.graph_objects as go
unique_list = ['home0', 'page_a0', 'page_b0', 'page_a1', 'page_b1',
'page_c1', 'page_b2', 'page_a2', 'page_c2', 'page_c3']
sources = [0, 0, 1, 2, 2, 3, 3, 4, 4, 7, 6]
targets = [3, 4, 4, 3, 5, 6, 8, 7, 8, 9, 9]
values = [2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2]
def nodify(node_names):
node_names = unique_list
# uniqe name endings
ends = sorted(list(set([e[-1] for e in node_names])))
# intervals
steps = 1/len(ends)
# x-values for each unique name ending
# for input as node position
nodes_x = {}
xVal = 0
for e in ends:
nodes_x[str(e)] = xVal
xVal += steps
# x and y values in list form
x_values = [nodes_x[n[-1]] for n in node_names]
y_values = [0.1]*len(x_values)
return x_values, y_values
nodified = nodify(node_names=unique_list)
# plotly setup
fig = go.Figure(data=[go.Sankey(
arrangement='snap',
node = dict(
pad = 15,
thickness = 20,
line = dict(color = "black", width = 0.5),
label = unique_list,
color = "blue",
x=nodified[0],
y=nodified[1]
),
link = dict(
source = sources,
target = targets,
value = values
))])
fig.show()
样本数据如下:
unique_list = ['home0', 'page_a0', 'page_b0', 'page_a1', 'page_b1',
'page_c1', 'page_b2', 'page_a2', 'page_c2', 'page_c3']
sources = [0, 0, 1, 2, 2, 3, 3, 4, 4, 7, 6]
targets = [3, 4, 4, 3, 5, 6, 8, 7, 8, 9, 9]
values = [2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2]
中的示例代码
fig = go.Figure(data=[go.Sankey(
node = dict(
pad = 15,
thickness = 20,
line = dict(color = "black", width = 0.5),
label = unique_list,
color = "blue"
),
link = dict(
source = sources,
target = targets,
value = values
))])
fig.show()
这将输出以下桑基图
但是,我想获得 在同一垂直列中以相同数字结尾的所有值,就像最左边的列的所有节点都以a 0. 我在 docs 中看到可以移动节点位置,但是我想知道除了手动输入 x 和 y 值之外是否有更简洁的方法来完成此操作。任何帮助表示赞赏。
在go.Sankey()
中设置arrangement='snap'
并调整x=<list>
和y=<list>
中的x和y位置。以下设置将根据要求放置您的节点。
剧情:
请注意,此示例中未明确设置 y 值。一旦同一 x 值有多个节点,y 值将自动调整以使所有节点显示在同一垂直位置。如果您确实想要明确设置所有位置,只需设置arrangement='fixed'
编辑:
我添加了一个自定义函数 nodify()
,它将相同的 x 位置分配给具有共同结尾的标签名称,例如 ['home0', 'page_a0', 'page_b0']
中的 '0'
。现在,如果您将 page_c1
更改为 page_c2
作为示例,您将得到:
完整代码:
import plotly.graph_objects as go
unique_list = ['home0', 'page_a0', 'page_b0', 'page_a1', 'page_b1',
'page_c1', 'page_b2', 'page_a2', 'page_c2', 'page_c3']
sources = [0, 0, 1, 2, 2, 3, 3, 4, 4, 7, 6]
targets = [3, 4, 4, 3, 5, 6, 8, 7, 8, 9, 9]
values = [2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2]
def nodify(node_names):
node_names = unique_list
# uniqe name endings
ends = sorted(list(set([e[-1] for e in node_names])))
# intervals
steps = 1/len(ends)
# x-values for each unique name ending
# for input as node position
nodes_x = {}
xVal = 0
for e in ends:
nodes_x[str(e)] = xVal
xVal += steps
# x and y values in list form
x_values = [nodes_x[n[-1]] for n in node_names]
y_values = [0.1]*len(x_values)
return x_values, y_values
nodified = nodify(node_names=unique_list)
# plotly setup
fig = go.Figure(data=[go.Sankey(
arrangement='snap',
node = dict(
pad = 15,
thickness = 20,
line = dict(color = "black", width = 0.5),
label = unique_list,
color = "blue",
x=nodified[0],
y=nodified[1]
),
link = dict(
source = sources,
target = targets,
value = values
))])
fig.show()