微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决通过顶点名称添加网络图属性

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

mymat = matrix(c(1,0),6,5)
colnames(mymat) <- c("tim","tom","jane","tarzan","maria")
rownames(mymat) <- c("tim","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),"female")

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

V(M)$gender <- ifelse(V(M) == startsWith(as.character(V(M)$name),"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"),"female")
V(M)$gender

再次,什么都没有。

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

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

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

    get.vertex.attribute(M)

解决方法

我不是 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,length.out = 5))

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

plot(M)

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

bipartite plot

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。