在固定位置绘制多重图节点
我有什么:一个包含四个节点和四条边的多重图。每个节点都有一个指定的位置(这些节点形成一个方形结构)。
我想要什么:根据节点的位置绘制这个多重图。
问题:最终的布局忽略了节点的位置。
这是我的代码:
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]: https://i.stack.imgur.com/UfiEv.jpg
如你所见,节点的位置被忽略了。
你能帮我吗?谢谢!
编辑已解决:Aric 的建议解决了我的问题。谢谢!!!
1 个回答
2
你可以在把图转换成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 是为了保持节点的位置)