从图中绘制边缘标签

时间:2019-04-09 12:15:58

标签: python-3.x networkx

是否有内置功能可将边标签添加到networkx库中的图形。可以通过使用nx.set_edge_attributes()函数来设置它们。但是我想知道是否有可能跳过此步骤,并避免在图形结构中已经有边缘标签信息的情况下手动进行操作。

例如,给定以下字典词典,其中键是节点,内部字典分别是目标和边缘标签。例如:

z = {'224': {'0': 'a'}, '0': {'217': 'b', '224': 'k'}, '217': {'220': 'c'}, '246': {'10': 'd'}, '10': {'241': 'f', '246': 'l'},
 '241': {'220': 'g'}, '11': {'22': 'p', '23': 'i'}, '22': {'9': 'p'}}

在以上词典中,“ 224”将是一个连接到“ 0”的节点,其标签为“ a”。

我知道我可以使用以下图形创建图形:

Z = nx.DiGraph(z)

并使用以下命令进行绘制:

pos = nx.spring_layout(Z)
nx.draw(Z, pos, with_labels=True, font_weight='bold')

我尝试从z手动添加标签,但是当一个节点至少以预期的方式连接到具有自身边缘标签的多个节点时,无法捕获这种情况。

到目前为止,我尝试过的是:

edge_labels = dict()
for (k, v), e in zip(z.items(), Z.edges()):
    for x, y in v.items():
        edge_labels[e] = {'attr1': y}

然后通过以下方式添加这些标签:

nx.set_edge_attributes(Z, edge_labels)

但是失败,并且在使用Z.edges(data=True)查看边缘时会给出以下错误输出:

Out[38]: OutEdgeDataView([('224', '0', {'attr1': 'a'}), ('0', '217', {'attr1': 'k'}), ('0', '224', {'attr1': 'c'}), ('217', '220', {'attr1': 'd'}), ('246', '10', {'attr1': 'l'}), ('10', '241', {'attr1': 'g'}), ('10', '246', {'attr1': 'i'}), ('241', '220', {'attr1': '8'}), ('11', '22', {}), ('11', '23', {}), ('22', '9', {})])

我在这里缺少明显的东西吗?

预期输出应如下所示:

Out[39]: OutEdgeDataView([('224', '0', {'attr1': 'a'}), ('0', '217', {'attr1': 'b'}), ('0', '224', {'attr1': 'k'}), ('217', '220', {'attr1': 'c'}), ('246', '10', {'attr1': 'd'}), ('10', '241', {'attr1': 'f'}), ('10', '246', {'attr1': 'l'}), ('241', '220', {'attr1': 'g'}), ('11', '22', {'attr1': 'p'}), ('11', '23', {'attr1': 'i'}), ('22', '9', {'attr1': 'p'})])

1 个答案:

答案 0 :(得分:0)

networkx具有功能draw_networkx_edge_labels,可让您绘制图形标签。但这不是图的基本功能,因此其用法有点令人困惑:

您首先应该创建图形,其节点和边。之后,您应该创建图形布局,然后将其用于工程图。这是示例:

import networkx as nx

# Create graph
G = nx.DiGraph()
G.add_nodes_from([1,2,3,4,5])
G.add_edges_from([(1,2),(2,3),(2,4),(4,5)])
for n in G.nodes:
    G.nodes[n]['label'] = str(n)*5

# Create labels dicts
labels = {
    n: (G.nodes[n]['label']
        if len(list(nx.all_neighbors(G, n))) > 2
        else '')
    for n in G.nodes
}
edge_labels = {e: str(e) for e in G.edges}

# Create graph layout
layout = nx.spring_layout(G)

# Create label edges
edge_labels_pos = nx.draw_networkx_edge_labels(
    G,
    layout,
    edge_labels=edge_labels
)

# Draw the graph
nx.draw(G, with_labels=True, labels=labels, pos=layout)

结果如下:

enter image description here

但是不要忘记事先创建布局并在任何地方使用它!如果要多次调用布局函数,则会得到类似的内容:

enter image description here