In the class networkx.MultiGraph
, an edge is keyed by (u, v, key)
, for instance, ('n1', 'n2', 'key1')
. I would like to draw edge labels (say weight, (u, v, key): 10
) for MultiGraph
by using the function networkx.draw_networkx_edge_labels
.
However, edge labels are keyed by a two-tuple (u, v)
in draw_networkx_edge_labels
, instead of a 3-tuple (u, v, key)
, as is the case in MultiGraph
. This raises ValueError: too many values to unpack
.
PS: The parameter edge_labels
in draw_networkx_edge_labels
is described as follows:
draw_networkx_edge_labels(
G, pos,
edge_labels=None, label_pos=0.5,
font_size=10, font_color='k',
font_family='sans-serif', font_weight='normal',
alpha=1.0, bbox=None, ax=None,
rotate=True, **kwds)
Edge labels in a dictionary of labels keyed by edge two-tuple. Only labels for the keys in the dictionary are drawn.
(Note the "two-tuple" in this description.)
I could not even find how to draw a multigraph with matplotlib
(because the multiple edges won't show up). However if you export to dot
you will be able to see multiple edges, and you can label them with a label attribute in the edges.
#!/usr/bin/env python
import networkx as nx
G = nx.MultiGraph()
G.add_node('A')
G.add_node('B')
G.add_edge('A','B', label='foo')
G.add_edge('A','B', label='bar')
# dump dot code
nx.drawing.nx_pydot.write_dot(G, 'multi.dot')
This code requires networkx
, pydot
, and GraphViz.
Note that if you look into the module networkx.drawing.nx_pylab
, the default behavior of the function draw_networkx_edge_labels
is to use
{(u, v): d for u, v, d in G.edges(data=True)}
as the (default value for the) edge_labels
attribute which will fail for multigraphs because the dictionnary key has to be unique. Thus, if you want to plot using matplotlib
, you will probably need to modify the function draw_networkx_edge_labels
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With