我看到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()
我看到下图,其中显示了所有的边属性。我希望只有标题会出现。
我正在构建的图形是一个逐步的过程,因此随着更多信息的处理,边缘标签也会更新。如何在图构造结束时只用我想要的属性标记边缘?
答案 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()
收益
由于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))
生成了您在结果中看到的“奇怪”标签。