如何解决通过顶点名称添加网络图属性
我有一个矩阵,从中我可以用 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
再次,什么都没有。
-
题外话:为什么 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 值,我们用绿色和黄色着色并在空间上分开。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。