使用 python-igraph 编写带有节点标签的 Pajek 文件
Write Pajek files with node labels using 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
你同事好心,但他(她)还是错了。 :) 要设置的正确属性称为 id
:
g = ig.Graph(vertex_attrs={'id': ['spam', 'eggs', 'ham']}, edges=[(1,0), (1,2)])
(我实际上并没有在 Python 中尝试过这个,因为我在安装 python-igraph 时遇到了困难。但是它在 R 中运行良好并且它们调用相同的 C 代码, 所以我 99% 确定它在 Python 中也有效。你能试试吗?)
我正在使用 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
你同事好心,但他(她)还是错了。 :) 要设置的正确属性称为 id
:
g = ig.Graph(vertex_attrs={'id': ['spam', 'eggs', 'ham']}, edges=[(1,0), (1,2)])
(我实际上并没有在 Python 中尝试过这个,因为我在安装 python-igraph 时遇到了困难。但是它在 R 中运行良好并且它们调用相同的 C 代码, 所以我 99% 确定它在 Python 中也有效。你能试试吗?)