通过顶点名称添加网络图属性

时间:2020-12-23 10:00:35

标签: r igraph

我有一个矩阵,从中我可以用 igraph 构建网络图。我想将不同类型顶点的信息存储为一个属性,我可以从它的名称中推断出来。我尝试了几种组合

mymat = matrix(c(1,0),6,5)
colnames(mymat) <- c("tim", "tom","jane","tarzan", "maria")
rownames(mymat) <- c("tim", "tom","jane","tarzan", "maria", "megan")
M <- graph_from_incidence_matrix(mymat)

V(M)$gender <- ifelse(V(M) == startsWith(as.character(V(M)),"t"), "male","female")
V(M)$gender

[1] "female" "female" "female" "female" "female" "female" "female" "female" "female" "female" "female"

我开始了但忘了调用属性的名称。

V(M)
V(M)$name

V(M)$gender <- ifelse(V(M)$name == startsWith(as.character(V(M)$name),"t"), "male","female")

那里也没有。偶然我称之为:

V(M)$gender <- ifelse(V(M) == startsWith(as.character(V(M)$name),"t"), "male","female")
V(M)$gender
 [1] "male"   "female" "female" "female" "female" "female" "female" "female" "female" "female" "female"

但为什么不是其他人,我想?好像只看第一个?

V(M)$gender <- ifelse(V(M) == startsWith(as.character(V(M)$name),"to"), "male","female")
V(M)$gender

再次,什么都没有。

  1. 我使用 ifelse 的方式有问题吗?我需要写一个函数吗?

  2. 我调用属性名称的方式有问题吗?

  3. 题外话:为什么 graph_from_incidence_matrix 或 igraph 通常会创建“类型”属性,并且此处指定的理由是“假”和“真”。你可以在这里看到它

    get.vertex.attribute(M)

1 个答案:

答案 0 :(得分:0)

我不是 igraph 的专家,但我想尽我所能尝试回答。如果有人看到这个答案并注意到不正确的地方,请发表评论以便我修复!

首先,听起来您希望确定哪些顶点以字母“t”开头并分配一个 gender 值。根据 V(M),您的图中有 11 个顶点:

V(M)

+ 11/11 vertices, named, from f5ca776:
 [1] tim    tom    jane   tarzan maria  megan  tim    tom    jane   tarzan maria 

有些名称重复。

首先检查名称是否以“t”开头,您的代码在这里部分正确:

startsWith(V(M)$name, "t")
# alternative: startsWith(attr(V(M), "names"), "t")

[1]  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE

这为您提供了一个逻辑向量,其中 names 属性以“t”开头。这看起来是正确的。

因此,对于您的 ifelse 语句,您已经拥有确定 gender 所需的逻辑值。您无需将其与 V(M) 进行比较。

M <- set_vertex_attr(M, 
                     "gender", 
                     value = ifelse(startsWith(V(M)$name, "t"), "male", "female"))
M

IGRAPH f5ca776 UN-B 11 15 -- 
+ attr: type (v/l), name (v/c), gender (v/c)
+ edges from f5ca776 (vertex names):
 [1] tim  --tim    tim  --tom    tim  --jane   tim  --tarzan tim  --maria  jane --tim    jane --tom    jane --jane  
 [9] jane --tarzan jane --maria  maria--tim    maria--tom    maria--jane   maria--tarzan maria--maria 

您现在已经为 gender 创建了属性:

V(M)$gender

[1] "male"   "male"   "female" "male"   "female" "female" "male"   "male"   "female" "male"   "female"

现在,您注意到创建了 type 属性。您的图已确定为二部图:

is_bipartite(M)

[1] TRUE

要可视化,您可以执行以下操作:

plot(M, layout = layout_as_bipartite(M))

或者根据 type 以这种方式修复:

V(M)[type]$color <- 'green'
V(M)[!type]$color <- 'yellow'

V(M)$x <- c(rep(1, 6), rep(2, 5))
V(M)$y <- c(seq(1, 5, length.out = 6), seq(1, 5, length.out = 5))

V(M)$label.cex <- .5
V(M)$size <- 30

plot(M)

基于 TRUE/FALSE 值,我们用绿色和黄色着色并在空间上分开。

bipartite plot