【问题标题】:Drawing nodes of multigraph in fixed position多图在固定位置绘制节点
【发布时间】:2014-11-02 16:32:39
【问题描述】:

我有什么:具有四个节点和四个边的多重图。每个节点都有一个指定的位置(节点形成一个小队结构)
我想要什么:使用节点位置绘制多重图。
问题:位置被忽略在最终布局中。

这是我的代码:

import networkx as nx
import pydot
from my_lib import *
graph= nx.MultiGraph()

#add 4 nodes in the vertexs of a square. X and Y are the coordinates
graph.add_node(1,x=10,y=10)
graph.add_node(2,x=10,y=20)
graph.add_node(3,x=20,y=10)
graph.add_node(4,x=20,y=20)
graph.add_edge(1,2)
graph.add_edge(2,3)
graph.add_edge(3,4)
graph.add_edge(4,1)

#transform the multigraph in pydot for draw it
graphDot=nx.to_pydot(graph)

#change some attribute for the draw, like shape of nodes and the position of nodes 
for node in graphDot.get_nodes():

    node.set_shape('circle')
    #getAttrDot is a function that returns the value of attribute passed
    pos_string='\''+ get_attrDot(node,'x')+','+get_attrDot(node,'y')+'!\''
    print 'coordinate: ' + pos_string  #the pos_string printed is correct form: 'x,y!'
    node.set('pos',pos_string)

graphDot.write_png('test_position.png')

这里是这段代码的结果。
图片'test_position.png'是:[1]:http://imgur.com/dDj3xFl

如你所见,节点位置被忽略了。

你能帮帮我吗? 谢谢!

编辑已解决: Aric 的建议解决了我的问题。谢谢!!!

【问题讨论】:

    标签: python graph position draw networkx


    【解决方案1】:

    您可以在将图形转换为 Pydot 对象之前设置属性:

    import networkx as nx                                                                                     
    graph= nx.MultiGraph()                                                                                    
    
    #add 4 nodes in the vertexs of a square. X and Y are the coordinates                                      
    graph.add_node(1,x=100,y=100)                                                                             
    graph.add_node(2,x=100,y=200)                                                                             
    graph.add_node(3,x=200,y=100)                                                                             
    graph.add_node(4,x=200,y=200)                                                                             
    graph.add_edge(1,2)                                                                                       
    graph.add_edge(2,3)                                                                                       
    graph.add_edge(3,4)                                                                                       
    graph.add_edge(4,1)                                                                                       
                                                                                                             # assign positions                                                                                        
    for n in graph:                                                                                           
        graph.node[n]['pos'] = '"%d,%d"'%(graph.node[n]['x'], graph.node[n]['y'])                             
    p = nx.to_pydot(graph)                                                                                    
    print p.to_string()                                                                                       
    p.write('foo.dot')                                                                                        
    # run neato -n2 -Tpng foo.dot >foo.png  
    

    输出是:

    graph G {
    1 [y=100, x=100, pos="100,100"];
    2 [y=200, x=100, pos="100,200"];
    3 [y=100, x=200, pos="200,100"];
    4 [y=200, x=200, pos="200,200"];
    1 -- 2  [key=0];
    1 -- 4  [key=0];
    2 -- 3  [key=0];
    3 -- 4  [key=0];
    }
    

    运行 neato -n2 -Tpng foo.dot >foo.png (-n2 保留您的节点位置)

    【讨论】:

    • 感谢 Aric 的回答。但是当使用命令行neato -n2 -Tpng foo.dot >foo.png时,windows的提示命令说:neato can't open foo.dot。为什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 2017-06-30
    • 2018-05-10
    • 2011-02-20
    • 1970-01-01
    • 2019-04-13
    相关资源
    最近更新 更多