Python Networkx Weight Labels Positioning

前端 未结 1 1518
眼角桃花
眼角桃花 2021-01-24 23:50

The code below produces a very \"dodgy\" placement of the labels for edge weights in a graph. Please see image. I would like to have a better placement (close to the midpoint of

相关标签:
1条回答
  • 2021-01-25 00:52

    From the documentation of draw_networkx:

    draw_networkx(G, pos=None, arrows=True, with_labels=True, **kwds)
    Parameters:   
    [...]
    pos (dictionary, optional) – A dictionary with nodes as keys and positions as values. If not specified a spring layout positioning will
    be computed. See networkx.layout for functions that compute node
    positions.
    

    So, if you do not pass pos explicitly, a spring_layout is generated, but this won't be identical to the layout that you generate through

    pos = nx.spring_layout(G)
    

    , because calling nx.spring_layout(G) twice gives different results:

    for a in [0,1]:
        pos = nx.spring_layout(G)
        print(pos)
    

    output:

    {'A': array([ 0.65679786, -0.91414348]), 'B': array([0.34320214, 0.5814527 ]), 'C': array([-1.        ,  0.33269078])}
    {'A': array([-0.85295569, -0.70179415]), 'B': array([ 0.58849111, -0.29820585]), 'C': array([0.26446458, 1.        ])}
    

    So, passing the same pos to both drawing functions solves the problem:

    pos = nx.spring_layout(G)
    weights = nx.get_edge_attributes(G, "weight")
    nx.draw_networkx(G, pos, with_labels=True)
    nx.draw_networkx_edge_labels(G, pos, edge_labels=weights)
    
    0 讨论(0)
提交回复
热议问题