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

9
class networkx.MultiGraph 中,一条边由 (u, v, key) 键控,例如 ('n1', 'n2', 'key1')。我想通过使用 函数 networkx.draw_networkx_edge_labelsMultiGraph 绘制边标签(例如权重 (u, v, key): 10)。

然而,在 draw_networkx_edge_labels 中,边标签由一个二元组 (u, v) 键控,而不是 MultiGraph 中的 3-元组 (u, v, key)。这会引发 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)

在以边的二元组为键的标签字典中,包含边标签。只会绘制字典中键对应的标签。
(注意该描述中的“二元组”)
1个回答

6

我甚至找不到如何使用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, 和 GraphViz.

multigraph with edge labels

请注意,如果您查看模块 networkx.drawing.nx_pylab,函数 draw_networkx_edge_labels 的默认行为是 使用
{(u, v): d for u, v, d in G.edges(data=True)}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接