为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

摇曳的蔷薇 2022-10-06 15:57:17
样本数据如下: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()这将输出以下 sankey 图但是,我想在同一垂直列中获取以相同数字结尾的所有值,就像最左边一列的所有节点都以 0 结尾一样。我在文档中看到可以移动节点位置,但是我想知道是否有比手动输入 x 和 y 值更简洁的方法。任何帮助表示赞赏。
查看完整描述

1 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

在和 中go.Sankey()设置和调整 x和arrangement='snap'y 位置。以下设置将按要求放置您的节点。x=<list>y=<list>

阴谋:

//img1.sycdn.imooc.com//633e8a850001889804790288.jpg

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

编辑:

我添加了一个自定义函数nodify(),该函数将相同的 x 位置分配给具有共同结尾的标签名称,例如'0'in ['home0', 'page_a0', 'page_b0']。现在,如果你作为一个例子改变page_c1page_c2会得到这个:

//img1.sycdn.imooc.com//633e8a8e0001960805210305.jpg

完整代码:


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



查看完整回答
反对 回复 2022-10-06
  • 1 回答
  • 0 关注
  • 726 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号