使用python-igraph用节点标签写Pajek文件

时间:2015-03-05 13:41:29

标签: python igraph

我正在使用igraph构建图形并将它们写为Pajek(.net)文件,以便将它们与其他程序一起使用。 Pajek文件是用顶点而不是顶点标签的数字索引编写的,所以当我将文件读入另一个程序时,标签就不见了。

这是一个简单的例子:

>>> g = ig.Graph(vertex_attrs={'label': ['spam', 'eggs', 'ham']}, edges=[(1,0), (1,2)])
>>> g.vs.get_attribute_values('label')
['spam', 'eggs', 'ham']
>>> g.write_pajek('file.net')

$ head file.net
*Vertices 3
*Edges
1 2
2 3

是否可以更改write_pajek()的行为来写出标签而不仅仅是索引?


一位善意的同事指出,基础igraph C库doesn't have能够写出顶点标签。

这是一种解决方法:

import igraph as ig
g = ig.Graph(vertex_attrs={'label': ['spam', 'eggs', 'ham']}, edges=[(1,0), (1,2)])
g.write_gml('file.gml')

import networkx as nx
n = nx.read_gml('file.gml')
nx.write_pajek(n, 'nxfile.net')

$ head nxfile.net
*vertices 3
0 0 0.0 0.0 ellipse label spam id 0
1 1 0.0 0.0 ellipse label eggs id 1
2 2 0.0 0.0 ellipse label ham id 2
...

更新

无需解决方法!感谢Gabor指出write_pajek()使用id属性,而不是label属性。

>>> g.vs['id'] = g.vs['label'] 
>>> g.write_pajek('igfile.net') 

$ head igfile.net 
*Vertices 3 
1 "spam" 
2 "eggs" 
3 "ham" 
*Edges 
1 2 
2 3

1 个答案:

答案 0 :(得分:2)

你的同事是善良的,但他仍然是错的。 :)要设置的正确属性称为id

g = ig.Graph(vertex_attrs={'id': ['spam', 'eggs', 'ham']}, edges=[(1,0), (1,2)])

(我实际上并没有在Python中尝试过这个,因为我很难安装python-igraph。但它从R工作正常,他们调用相同的C代码,所以我99%肯定它也适用于Python。你能试试吗?)