iGraph (R) - 有条件地改变边的颜色或权重
iGraph (R) - conditionally changing the color or weight of an edge
我正在尝试根据与特定节点对应的标志值更改图中节点的颜色。例如,请参见下面的边缘列表 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]
知道为什么这行不通吗?
图表的数据显示在最后。
有很多东西需要调整才能得到你想要的。首先,正如我在评论中指出的那样,在您构建它时,realfriend
是边的 属性,而不是顶点。为了能够为顶点着色,您需要 属性 个顶点。我相信您的意思是 HAVE$ego(第一列)中列出的 everyone 是真实的。 HAVE$realfriend 是 HAVE$friend(第二列)是否真实的指标。所以我们需要将它从边转移到顶点。然后我们可以使用类似于您的代码的东西来为顶点分配颜色,但是还有其他小问题需要解决。您使用 V(test)$realfriend 索引颜色列表。但是(一旦我们创建它)V(test)$realfriend 取值 0 或 1。没有颜色 0。我们需要颜色 1 或 2,所以我在 V(test)$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)
注意迪伦是红色的,其余的是蓝色的。
数据
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)
我正在尝试根据与特定节点对应的标志值更改图中节点的颜色。例如,请参见下面的边缘列表 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]
知道为什么这行不通吗?
图表的数据显示在最后。
有很多东西需要调整才能得到你想要的。首先,正如我在评论中指出的那样,在您构建它时,realfriend
是边的 属性,而不是顶点。为了能够为顶点着色,您需要 属性 个顶点。我相信您的意思是 HAVE$ego(第一列)中列出的 everyone 是真实的。 HAVE$realfriend 是 HAVE$friend(第二列)是否真实的指标。所以我们需要将它从边转移到顶点。然后我们可以使用类似于您的代码的东西来为顶点分配颜色,但是还有其他小问题需要解决。您使用 V(test)$realfriend 索引颜色列表。但是(一旦我们创建它)V(test)$realfriend 取值 0 或 1。没有颜色 0。我们需要颜色 1 或 2,所以我在 V(test)$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)
注意迪伦是红色的,其余的是蓝色的。
数据
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)