R语言igraph如何按条件设置vertex.shape及相关报错解决问询
错误原因
- 属性访问逻辑错误:igraph的顶点属性需要通过
V(网络对象)$属性名语法读取,直接用phage$prophage读取的是网络全局属性而非顶点属性,无法拿到正确值。 - 属性名大小写不匹配:原始数据中列名为
Prophage(首字母大写),代码中调用的是小写prophage,取不到对应字段会返回NA。 - 形状赋值逻辑不完整:
ifelse仅覆盖了yes和no两种取值,undef对应的形状未赋值,返回的NA不被igraph识别,直接触发报错。 - 顶点属性挂载错误:直接用
graph.data.frame读取含Prophage的边列表时,Prophage会被识别为边属性而非顶点属性,和实际业务逻辑不符。
修正代码
# 1. 整理顶点属性表:提取所有唯一节点对应的Prophage属性 vertex_df <- unique(rbind( innerJoinDf[, c("Locus", "Prophage")], setNames(innerJoinDf[, c("X2", "Prophage")], c("Locus", "Prophage")) )) # 2. 构建网络,同时挂载顶点属性 phage <- graph.data.frame( d = innerJoinDf[, c("Locus", "X2", "X3")], # 边列表,第三列为边权重 vertices = vertex_df ) # 3. 给三种Prophage取值分别匹配对应形状 vertex_shape <- ifelse(V(phage)$Prophage == "yes", "square", ifelse(V(phage)$Prophage == "no", "circle", "triangle")) # 4. 绘图 plot(phage, vertex.label = NA, vertex.color = betweenness(phage), vertex.shape = vertex_shape)
补充说明
如果节点对应的Prophage属性全局唯一,上述代码可直接运行;如果存在同一个节点对应多个Prophage取值的情况,需先按业务逻辑清洗顶点属性表再执行后续步骤。
内容的提问来源于stack exchange,提问作者Théo Durand
相关产品推荐
相关产品推荐

