iGraph(R) - 有条件地改变边缘的颜色或重量

时间:2018-05-29 21:38:19

标签: r igraph graph-visualization

我正在尝试根据与特定节点对应的标志值更改图表中节点的颜色。请参阅下面的边缘列表HAVE,例如:

ego friend  realfriend  resources
Joe Jim              1          2
Joe Jon              1          1
Joe James            1          5
Sam Jeff             1          2
Sam Stephanie        1          3
Sam Joe              1          1
Sam Jim              1          1
Bob Dylan            0          1
Bob Jim              1          4

Dylan是一个想象中的朋友,所以我希望代表他的节点(以及其他想象中的朋友)与realfriend = 1不同。我将HAVE变成一个情节,如下所示:

test <- graph.data.frame(HAVE, directed=F)
plot(test, vertex.size=degree(test))

但是当我尝试根据realfriend的值使节点显示为不同的颜色时,图表不会产生任何颜色变化:

colrs <- c("red", "blue")
V(test)$color <- colrs[V(test)$realfriend]

知道为什么这不起作用?

1 个答案:

答案 0 :(得分:1)

图表的数据显示在最后。

有很多事情需要调整才能得到你想要的东西。首先,正如我在评论中所指出的,当你构造它时,realfriend是边的属性,而不是顶点的属性。为了能够为顶点着色,您需要顶点的属性。我相信你的意思是在HAVE $ ego(第一栏)中列出的所有人是真实的。 HAVE $ realfriend是HAVE $ friend(第二列)是否真实的指标。所以我们需要将它从边缘转移到顶点。然后我们可以使用类似代码的东西来为顶点指定颜色,但还有其他一些小问题需要解决。您使用V(test)$ realfriend索引颜色列表。但是(一旦我们创建它)V(测试)$ realfriend采用值0或1.没有颜色0.我们需要颜色1或2,所以我在使用它作为一个V(测试)$ realfriend时添加一个索引到颜色。此外,您将一些顶点绘制得非常小,因此很难分辨它们的颜色。我保持大小与度数成比例,但使顶点更大。所以,把这一切放在一起:

library(igraph)
test <- graph.data.frame(HAVE, directed=F)

## label the vertices with reality
for(i in 1:ecount(test)) {
    E = ends(test, E(test)[i])
    V(test)[E[1]]$realfriend = 1
    V(test)[E[2]]$realfriend = HAVE$realfriend[i]
}

colrs <- c("red", "blue")
V(test)$color <- colrs[V(test)$realfriend+1]

plot(test, vertex.size=degree(test)*6)

Graph with colored vertices

请注意,迪伦出现红色,其余为蓝色。

数据

HAVE = read.table(text="ego friend  realfriend  resources
Joe Jim              1          2
Joe Jon              1          1
Joe James            1          5
Sam Jeff             1          2
Sam Stephanie        1          3
Sam Joe              1          1
Sam Jim              1          1
Bob Dylan            0          1
Bob Jim              1          4",
header=TRUE)