【问题标题】:Networkx: how to show node and edge attributes in a graph drawingNetworkx:如何在图形中显示节点和边属性
【发布时间】:2013-12-21 07:10:54
【问题描述】:

我有一个图 G,其节点和边的属性为“状态”。我想绘制图形,标记所有节点,并在相应的边/节点之外标记状态。

for v in G.nodes():     
    G.node[v]['state']='X'
G.node[1]['state']='Y' 
G.node[2]['state']='Y'

for n in G.edges_iter():    
    G.edge[n[0]][n[1]]['state']='X'
G.edge[2][3]['state']='Y'

draw.networkx 命令有标签选项,但我不明白如何将属性作为标签提供给该命令。有人可以帮我吗?

【问题讨论】:

    标签: python graphviz networkx


    【解决方案1】:

    它不是那么漂亮 - 但它的工作原理是这样的:

    from matplotlib import pyplot as plt
    import networkx as nx
    G = nx.Graph()
    G.add_edge(1,2)
    G.add_edge(2,3)
    for v in G.nodes():
        G.node[v]['state']='X'
    G.node[1]['state']='Y'
    G.node[2]['state']='Y'
    
    for n in G.edges_iter():
        G.edge[n[0]][n[1]]['state']='X'
    G.edge[2][3]['state']='Y'
    
    pos = nx.spring_layout(G)
    
    nx.draw(G, pos)
    node_labels = nx.get_node_attributes(G,'state')
    nx.draw_networkx_labels(G, pos, labels = node_labels)
    edge_labels = nx.get_edge_attributes(G,'state')
    nx.draw_networkx_edge_labels(G, pos, labels = edge_labels)
    plt.savefig('this.png')
    plt.show()
    

    【讨论】:

    • 谢谢,但我需要稍作修改。节点的标签与状态不同。我需要节点顶部的 X 和 Y 以及其中的 1 和 2 之类的数字。
    • 如果您需要更复杂(和更漂亮)的标签绘图,您可以考虑使用 Graphviz 进行绘图 - graphivz.org。使用 write_dot 将您的图形从 networkx(如果需要,包括属性)输出为点格式,然后使用 Graphviz 进行处理。
    • 所有节点的位置都在“pos”字典中。您可以使用例如手动标记它们。 x,y=pos[1] 然后 plt.text(x,y,'label')
    • 是否可以只打印属性的值?而不是关键。例如在这种情况下,只打印'X'而不打印'state',如何?
    • @Kairos 见第三行最后一行nx.draw_networkx_edge_labels(G, pos, labels = edge_labels) 将其更改为nx.draw_networkx_edge_labels(G, pos, edge_labels)
    猜你喜欢
    • 1970-01-01
    • 2013-03-18
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    相关资源
    最近更新 更多