Search code examples
pythongraphlabelnetworkx

How to label edges of a Multigraph in Networkx and matplotlib?


I have a Undirected Multigraph and I wanna draw the edges with labels, any suggestion? I the follow suggestion, but still no edges labels. Drawing multiple edges between two nodes with networkx by atomh33ls

G=nx.MultiGraph ()
G.add_edge(1,2,weight=7)
G.add_edge(1,2,weight=2)
G.add_edge(1,2,weight=3)
G.add_edge(3,1,weight=2)
G.add_edge(3,2,weight=3)

node_label = nx.get_node_attributes(G,'id')
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G, pos, label=node_label)
nx.draw_networkx_labels(G, pos, label=node_label)
edge_labels=nx.get_edge_attributes(G,'weight')
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])
                                ),
                                ),
                )
#nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
plt.axis('off')
plt.show()

Undirected MultiGraph example


Solution

  • The dictionary returned by nx.get_edge_attributes has the structure (source, dest, enum):attr, where the third field just enumerates the occurrences of each edge. This third field is necessary because keys have to be unique in the dictionary. However this will imply that it cannot be used in nx.draw_networkx_edge_labels, because it expects a (source, dest):attr structured dict.

    nx.get_edge_attributes(G,'weight')
    # {(1, 2, 0): 7, (1, 2, 1): 2, (1, 2, 2): 3, (1, 3, 0): 2, (2, 3, 0): 3}
    

    So really this won't work on MultiGraphs. Something you can do, following the same idea as here, is to label the edges with the weight values, and export the graph to dot with nx.write_dot, which will use those labels on the visualization.