如何根据条件用 igraph 在 R 中更改 vertex.shape

How to change vertex.shape in R with igraph according to condition

我正在尝试更改 vertex.shape 但它不起作用 :

我有一个像这样的数据框:

Locus     X2     X3     Prophage
Vi_1236  Vi_456  5         yes
Vi_1254  Vi_263  6         no
Vi_1369  Vi_139  2         undef

我想得到一个带有 igraph 的图表,我可以根据节点的中心性为节点着色,当 Prophage == "yes" 我想要一个方形节点,当它不是圆形节点时,当它是取消定义三角形节点。

所以,我做到了:

phage = graph.data.frame(innerJoinDf)
vertex = ifelse(phage$prophage == "yes","square","circle")
plot.igraph(phage, vertex.label = NA, vertex.color = betweenness(phage), vertex.shape = vertex)

我收到以下错误:

Error in .igraph.shapes[[shape[el[x, 1]]]] : 
  wrong arguments for subsetting an environment

你能帮帮我吗?

您的数据在 innerJoinDf 中的组织方式 Prophage 中的值被解释为边缘属性。您可以通过查看 igraph 对象来了解这一点;其中顶点属性由 v 表示,边由 e 表示。 (您可以使用 vertex_attr(phage)edge_attr(phage) 查看实际属性)。

library(igraph)

phage <- graph_from_data_frame(innerJoinDf)
phage
# IGRAPH d6af3b4 DN-- 6 3 -- 
# + attr: name (v/c), X3 (e/n), Prophage (e/c)
# + edges from d6af3b4 (vertex names):
# [1] Vi_1236->Vi_456 Vi_1254->Vi_263 Vi_1369->Vi_139

您的代码 vertex = ifelse(phage$prophage == "yes","square","circle") 无效,因为您无法使用 $ 符号直接访问属性(另外 Prophage 以大写字母 P 开头)。其中一种访问方式是使用 V(graph)E(graph),然后使用 $ 表示法,例如V(phage)$name.

因为您想使用 Prophage 将形状分配给 LocusX2 中给定的两个顶点,因此假设 Prophage 在您的数据中是唯一的这些顶点。一种方法是定义一个包含 Prophage 属性的向量,然后使用它来更新图形的顶点形状属性,该属性存储在 V(g) 中(您当然可以只传递ifelseigraph 绘图函数的结果,而不是显式添加 shape 属性)。

vertex <- setNames(rep(innerJoinDf$Prophage, 2), unlist(innerJoinDf[c("Locus", "X2")])) 
vertex
# Vi_1236 Vi_1254 Vi_1369  Vi_456  Vi_263  Vi_139 
#   "yes"    "no" "undef"   "yes"    "no" "undef" 

# This seems a bit convoluted but is an attempt to match by vertex name rather than order
V(phage)$shape <- ifelse(vertex[V(phage)$name] == "yes", "square", "circle")
# or
# V(phage)$shape <- c( "circle", "square")[(vertex[V(phage)$name] == "yes") + 1L]
V(phage)$shape 
# [1] "square" "circle" "circle" "square" "circle" "circle"

数据

innerJoinDf=read.table(header=TRUE, text="
Locus     X2     X3     Prophage
Vi_1236  Vi_456  5         yes
Vi_1254  Vi_263  6         no
Vi_1369  Vi_139  2         undef")