iGraph(R)中基于realfriend字段设置节点颜色失效问题排查
问题:igraph设置节点颜色未生效?这是关键原因!
你遇到的问题其实是igraph里边属性和节点属性的混淆导致的,我来给你拆解清楚:
首先,你用graph.data.frame(HAVE, directed=F)创建图的时候,边列表里除了前两列(ego和friend,也就是节点对),剩下的realfriend和resources都会被默认当成边的属性,而不是节点的属性!所以你后来调用V(test)$realfriend的时候,这个属性根本不存在——它属于边(E(test)$realfriend),不是节点,自然没法用来给节点分配颜色。
那该怎么解决呢?核心是把realfriend从边属性转换成节点属性,步骤如下:
1. 整理每个节点对应的realfriend值
首先你需要从边列表里提取所有节点,并确定每个节点对应的realfriend值(这里假设每个节点的realfriend值在所有边里是一致的,比如Dylan只在一条边里是0,其他节点都是1):
# 把ego和friend列的节点都取出来,对应各自边的realfriend值 node_attrs <- data.frame( name = c(HAVE$ego, HAVE$friend), realfriend = rep(HAVE$realfriend, 2) ) # 去重,确保每个节点只保留一个realfriend值 node_attrs <- unique(node_attrs)
2. 给图的节点添加realfriend属性
现在把整理好的节点属性关联到图上:
# 匹配节点名称,给每个节点赋值realfriend V(test)$realfriend <- node_attrs$realfriend[match(V(test)$name, node_attrs$name)]
3. 正确设置节点颜色
这里要注意R的索引是从1开始的!你的realfriend值是0和1,直接用colrs[V(test)$realfriend]的话,0会被当成无效索引,所以要加1:
colrs <- c("red", "blue") # realfriend=0取red(索引1),realfriend=1取blue(索引2) V(test)$color <- colrs[V(test)$realfriend + 1]
验证一下
你可以先运行print(V(test)$realfriend),看看是不是每个节点都有了对应的0或1值,再重新绘图:
plot(test, vertex.size=degree(test))
这样节点颜色就会按照你的要求显示了——Dylan会是红色,其他realfriend=1的节点是蓝色。
内容的提问来源于stack exchange,提问作者J.Q
相关产品推荐
相关产品推荐

