NetworkX 中的边标签不正确

Spi*_*or8 1 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)
Run Code Online (Sandbox Code Playgroud)

这给出了预期的输出,即边的标题属性。

{('A', 'B'): 'ab'}
Run Code Online (Sandbox Code Playgroud)

当我使用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()
Run Code Online (Sandbox Code Playgroud)

我看到下图,其中显示了所有边缘属性。我预计只会出现标题。

在此输入图像描述

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

unu*_*tbu 7

使用

nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
Run Code Online (Sandbox Code Playgroud)

代替

nx.draw_networkx_edge_labels(G, pos, labels=edge_labels)
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)

产量

在此输入图像描述


由于 的调用签名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)
Run Code Online (Sandbox Code Playgroud)

该函数期望由关键字参数提供标签edge_labels。由于调用签名还包含**kwds,所以伪造的参数labels就被默默吞掉了,这段代码

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

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