Plotly:如何在Sankey图中设置节点位置?

2024-09-30 14:31:13 发布

您现在位置:Python中文网/ 问答频道 /正文

样本数据如下:

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]

使用来自the documentation的示例代码

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()

这将输出以下sankey图

enter image description here

但是,我希望得到在同一垂直列中以相同数字结尾的所有值,就像最左边的列的所有节点都以0结尾一样。我在docs中看到可以移动节点位置,但是我想知道除了手动输入x和y值之外,是否还有更干净的方法。谢谢你的帮助


Tags: 数据go节点结尾pagefigdictlist
1条回答
网友
1楼 · 发布于 2024-09-30 14:31:13

go.Sankey()中设置arrangement='snap'并调整x=<list>y=<list>中的x和y位置。以下设置将根据请求放置节点

绘图:

enter image description here

请注意,在本例中未明确设置y值。一旦公共x值有多个节点,y值将自动调整,以使所有节点显示在相同的垂直位置。如果您想显式地设置所有位置,只需设置arrangement='fixed'

编辑:

我添加了一个自定义函数nodify(),该函数为具有公共结尾的标签名指定相同的x位置,例如['home0', 'page_a0', 'page_b0']中的'0'。现在,如果您将page_c1更改为page_c2,您将得到以下结果:

enter image description here

完整代码:

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()

相关问题 更多 >