如何在 NetworkX 中为 MultiGraph 绘制边标签?

How do I draw edge labels for MultiGraph in NetworkX?

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.

但是,边缘标签由 draw_networkx_edge_labels 中的二元组 (u, v) 键控,而不是 3 元组 (u, v, key),就像 MultiGraph 中的情况一样。这引发了 ValueError: too many values to unpack.


PS:draw_networkx_edge_labels中的参数edge_labels说明如下:

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.

(注意这个描述中的“二元组”。)

我什至找不到如何用 matplotlib 绘制多重图(因为多重边不会显示)。但是,如果导出到 dot,您将能够看到多个边,并且可以在边中使用标签属性标记它们。

#!/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')

此代码需要 networkx, pydot, and GraphViz.

请注意,如果您查看模块 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)}

作为 edge_labels 属性的(默认值),该属性对于多图将失败,因为字典键必须是唯一的。因此,如果您想使用 matplotlib 绘图,您可能需要修改函数 draw_networkx_edge_labels.