Drawing multiple edges between two nodes with networkx

后端 未结 4 672
闹比i
闹比i 2020-12-05 20:31

I need to draw a directed graph with more than one edge (with different weights) between two nodes. That is, I have nodes A and B and edges (A,B) with length=2 and (B,A) wit

相关标签:
4条回答
  • 2020-12-05 20:45

    You can use matplotlib directly using the node positions you have calculated.

    G=nx.MultiGraph ([(1,2),(1,2),(1,2),(3,1),(3,2)])
    pos = nx.random_layout(G)
    nx.draw_networkx_nodes(G, pos, node_color = 'r', node_size = 100, alpha = 1)
    ax = plt.gca()
    for e in G.edges:
        ax.annotate("",
                    xy=pos[e[0]], xycoords='data',
                    xytext=pos[e[1]], textcoords='data',
                    arrowprops=dict(arrowstyle="->", color="0.5",
                                    shrinkA=5, shrinkB=5,
                                    patchA=None, patchB=None,
                                    connectionstyle="arc3,rad=rrr".replace('rrr',str(0.3*e[2])
                                    ),
                                    ),
                    )
    plt.axis('off')
    plt.show()
    

    0 讨论(0)
  • 2020-12-05 21:03

    An improvement to the reply above is adding the connectionstyle to nx.draw, this allows to see two parallel lines in the plot:

    import networkx as nx
    import matplotlib.pyplot as plt
    G = nx.DiGraph() #or G = nx.MultiDiGraph()
    G.add_node('A')
    G.add_node('B')
    G.add_edge('A', 'B', length = 2)
    G.add_edge('B', 'A', length = 3)
    
    pos = nx.spring_layout(G)
    nx.draw(G, pos, with_labels=True, connectionstyle='arc3, rad = 0.1')
    edge_labels=dict([((u,v,),d['length'])
                 for u,v,d in G.edges(data=True)])
    
    plt.show()
    

    See here the result

    0 讨论(0)
  • 2020-12-05 21:06

    Add the following code to AMangipinto's solution to add edge labels in both directions (see link for picture):

    edge_labels = dict([((u, v,), f'{d["length"]}\n\n{G.edges[(v,u)]["length"]}')
                    for u, v, d in G.edges(data=True) if pos[u][0] > pos[v][0]])
    
    nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_color='red')
    

    The "if pos[u][0] > pos[v][0]" only adds an edge label in one direction. We add both lengths to the single label otherwise we would over write the first label on an edge. Note: The label won't show if the nodes have the same x position.

    plot with edge labels

    0 讨论(0)
  • 2020-12-05 21:08

    Try the following:

    import networkx as nx
    import matplotlib.pyplot as plt
    G = nx.DiGraph() #or G = nx.MultiDiGraph()
    G.add_node('A')
    G.add_node('B')
    G.add_edge('A', 'B', length = 2)
    G.add_edge('B', 'A', length = 3)
    
    pos = nx.spring_layout(G)
    nx.draw(G, pos)
    edge_labels=dict([((u,v,),d['length'])
                 for u,v,d in G.edges(data=True)])
    nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, label_pos=0.3, font_size=7)
    plt.show()
    

    This will return you this graph with two edges and the length shown on the edge:

    enter image description here

    0 讨论(0)
提交回复
热议问题