NetworkX中的边缘标签不正确

时间:2018-07-21 18:13:13

标签: python networkx

我看到networkx软件包有些奇怪。这是一个最小的具体可验证示例。

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()
G.add_edge('A', 'B', weight=1, title='ab', subtitle='testing')
edge_labels = nx.get_edge_attributes(G, 'title')
print(edge_labels)

这给出了预期的输出,即边缘的title属性。

{('A', 'B'): 'ab'}

当我使用edge_labels进行绘制时,

fig = plt.figure()
ax1 = plt.subplot2grid((1, 1), (0, 0))
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True)

nx.draw_networkx_edge_labels(G, pos, labels=edge_labels)
plt.show()

我看到下图,其中显示了所有的边属性。我希望只有标题会出现。

enter image description here

我正在构建的图形是一个逐步的过程,因此随着更多信息的处理,边缘标签也会更新。如何在图构造结束时只用我想要的属性标记边缘?

1 个答案:

答案 0 :(得分:3)

使用

nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)

代替

nx.draw_networkx_edge_labels(G, pos, labels=edge_labels)

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()
G.add_edge('A', 'B', weight=1, title='ab', subtitle='testing')
edge_labels = nx.get_edge_attributes(G, 'title')
print(edge_labels)

fig = plt.figure()
ax1 = plt.subplot2grid((1, 1), (0, 0))
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True)

nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
plt.show()

收益

enter image description here


由于call signature for nx.draw_networkx_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提供。由于呼叫签名还包含**kwds,因此伪造的参数labels被静默吞噬,而this piece of code

if edge_labels is None:
    labels = dict(((u, v), d) for u, v, d in G.edges(data=True))

生成了您在结果中看到的“奇怪”标签。