5

我无法阅读/创建有向图。我按照我在这里找到的步骤进行操作。

这是我的文本文件graph.txt

1 2
1 3
2 5
3 4
3 5
4 5
5 6
5 10
6 7
7 8
7 9
7 12
8 9
9 10
9 11
9 12
10 11
11 7
11 12

现在我读了这个graph.txt

library("igraph")
xlist<-read.graph("graph.txt", format="edgelist")

然后我绘制它:

plot(xlist)

但这不是我读入 xlist 的图表:

http://i.imgur.com/dubQh.png

如您所见,在 1->2、1->3、5->10 等之间没有边。如何正确读取有向图?

完成此操作后,如何显示两个节点之间的所有最短路径?

4

2 回答 2

6

这对我来说似乎很好用:

 xlist<-read.table("graph.txt")
 xlist <- graph.data.frame(xlist)
 plot(xlist)

注意更改节点并将它们从零向上索引(不是在下面的@Sacha Epskamp 评论中R的最新更新中)。igraph使用:

plot(xlist, vertex.label= V(xlist)$name)

你会看到你想要的名字。即1和2之间的边缘。

绘制最短路径的一种方法是使用get.all.shortest.paths,然后使用它来对图形进行子集化并对其进行过度绘制。有关我绘制生成树的类似示例,请参阅我对这个问题的回答。

于 2012-11-28T13:04:53.323 回答
5

错误的原因是边缘列表文件(即 format "edgelist")从零开始对顶点进行编号。这在所有 igraph 版本中都是相同的,即使最近的 R igraph 包从一个开始编号顶点。

原因是我们希望 R igraph 与 Python igraph 和 C igraph 保持一致,就文件格式而言。即由 Python igraph 编写的文件(在本例中为边列表文件)被 R igraph 和 Python igraph 以相同的方式解释。从零开始的编号是文件格式的一个属性。

如果您已经有一个边列表文件,它以 1 开始对顶点进行编号,那不是 igraphedgelist文件格式,您需要通过简单地从每个顶点 id 中减去一个来转换它。

scan()一种解决方法是使用or read.table()(scan()更快,如果您有大文件,这可能很重要)读取文件,然后graph()直接调用。在这种情况下,您不需要减一,因为在 R igraph 中,顶点 ID 是从一开始编号的。

于 2012-11-29T00:20:32.640 回答