igraph R中的顶点标签

时间:2017-05-19 09:36:22

标签: r plot igraph

我正在使用igraph绘制非定向力网络。

我的数据框为nodeslinks,如下所示:

> links
  source target  value sourceID targetID
1      3      4 0.6245  1450552  1519842
2      6      8 0.5723  2607133  3051992
3      9      7 0.7150  3101536  3025831
4      0      1 0.7695   401517   425784
5      2      5 0.5535  1045501  2258363

> nodes
      name group size
1   401517     1    8
2   425784     1    8
3  1045501     1    8
4  1450552     1    8
5  1519842     1    8
6  2258363     1    8
7  2607133     1    8
8  3025831     1    8
9  3051992     1    8
10 3101536     1    8

我使用igraph绘制这些内容如下:

gg <- graph.data.frame(links,directed=FALSE)
plot(gg, vertex.color = 'lightblue', edge.label=links$value, vertex.size=1, edge.color="darkgreen", 
     vertex.label.font=1, edge.label.font =1, edge.label.cex = 1, 
     vertex.label.cex = 2 )

enter image description here

在此图中,igraph使用sourcetarget的代理索引作为顶点标签。

我想在我的links表格中使用真实身份证明,表达为sourceIDtargetID

所以,对于:

  source target  value sourceID targetID
1      3      4 0.6245  1450552  1519842

这将显示为:

(1450552) ----- 0.6245 ----- (1519842)

而不是:

      (3) ----- 0.6245 ----- (4)

(请注意,links数据帧中的代理索引为零索引,nodes数据帧中的索引编号为索引。igraph绘图需要此偏移量为1。

我知道我需要以某种方式matchmap代理索引到name数据框内的相应nodes。但是,我不知所措,因为我不知道igraph绘制标签的顺序。

我怎样才能做到这一点?

我咨询了以下问题但无济于事:

Vertex Labels in igraph with R how to specify the labels of vertices in R R igraph rename vertices

3 个答案:

答案 0 :(得分:2)

您可以指定如下标签:

 library(igraph)
gg <- graph.data.frame(
  links,directed=FALSE, 
  vertices = rbind(
    setNames(links[,c(1,4)],c("id","label")), 
    setNames(links[,c(2,5)], c("id","label"))))
plot(gg, vertex.color = 'lightblue', edge.label=links$value, 
     vertex.size=1, edge.color="darkgreen", 
     vertex.label.font=1, edge.label.font =1, edge.label.cex = 1, 
     vertex.label.cex = 2 )

enter image description here

您也可以传递

merge(rbind(
    setNames(links[,c(1,4)],c("id","label")), 
    setNames(links[,c(2,5)], c("id","label"))), 
    nodes, 
    by.x="label", by.y="name")
如果需要其他节点属性,请

到vertices参数。

数据:

 links <- read.table(header=T, text="
  source target  value sourceID targetID
1      3      4 0.6245  1450552  1519842
2      6      8 0.5723  2607133  3051992
3      9      7 0.7150  3101536  3025831
4      0      1 0.7695   401517   425784
5      2      5 0.5535  1045501  2258363")

 nodes <- read.table(header=T, text="
      name group size
1   401517     1    8
2   425784     1    8
3  1045501     1    8
4  1450552     1    8
5  1519842     1    8
6  2258363     1    8
7  2607133     1    8
8  3025831     1    8
9  3051992     1    8
10 3101536     1    8")

答案 1 :(得分:2)

最简单的解决方案是重新排序links的列,因为根据文档:

  

&#34;如果顶点为NULL,则d的前两列用作符号边缘列表,其他列用作边缘属性。&#34;

因此,您的代码将在运行后提供正确的输出:

links <- links[,c(4,5,3)]

答案 2 :(得分:2)

看来我能够重新解决这个问题的答案来实现这个目标。

r igraph - how to add labels to vertices based on vertex id

关键是要使用vertex.label中的plot()属性,并选择nodes$names的切片子集。

对于我们的索引,我们可以自动使用igraph中返回的有序默认标签。要提取这些内容,您可以输入V(gg)$names

plot(gg)内我们可以写:

vertex.label = nodes[c(as.numeric(V(gg)$name)+1),]$name
# 1 Convert to numeric
# 2 Add 1 for offset between proxy links index and nodes index
# 3 Select subset of nodes with above as row index. Return name column

完整代码:

gg <- graph.data.frame(links,directed=FALSE)
plot(gg, vertex.color = 'lightblue', edge.label=links$value, vertex.size=1, edge.color="darkgreen", 
     vertex.label.font=1, edge.label.font =1, edge.label.cex = 1, 
     vertex.label.cex = 2, vertex.label = nodes[c(as.numeric(V(gg)$name)+1),]$name)

根据上述数据,这给出了:

enter image description here