【问题标题】:Plotly: How to set node positions in a Sankey Diagram?Plotly:如何在桑基图中设置节点位置?
【发布时间】:2020-07-23 22:42:22
【问题描述】:

样本数据如下:

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

这会输出下面的桑基图

但是,我想获得在同一垂直列中以相同数字结尾的所有值,就像最左边一列的所有节点都以 0 结尾一样。我明白了在docs 中,可以移动节点位置,但是我想知道除了手动输入 x 和 y 值之外是否还有更简洁的方法。任何帮助表示赞赏。

【问题讨论】:

    标签: python plotly plotly-python


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-08-28
      • 2014-05-10
      • 2022-11-29
      • 2022-10-18
      • 2019-06-25
      • 2016-04-30
      • 2018-11-02
      • 2020-12-04
      • 1970-01-01
      相关资源
      最近更新 更多