Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.4k views
in Technique[技术] by (71.8m points)

python - How do I draw edge labels for MultiGraph in NetworkX?

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

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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.

multigraph with edge labels

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...