如何根据条件用 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
将形状分配给 Locus
和 X2
中给定的两个顶点,因此假设 Prophage
在您的数据中是唯一的这些顶点。一种方法是定义一个包含 Prophage
属性的向量,然后使用它来更新图形的顶点形状属性,该属性存储在 V(g)
中(您当然可以只传递ifelse
到 igraph
绘图函数的结果,而不是显式添加 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")
我正在尝试更改 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
将形状分配给 Locus
和 X2
中给定的两个顶点,因此假设 Prophage
在您的数据中是唯一的这些顶点。一种方法是定义一个包含 Prophage
属性的向量,然后使用它来更新图形的顶点形状属性,该属性存储在 V(g)
中(您当然可以只传递ifelse
到 igraph
绘图函数的结果,而不是显式添加 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")