更改特定边 igraph R 的顶点节点颜色

Change Vertex Node colour for specific edge igraph R

我正在使用无向图。我正在寻找绘制图形,并为满足某些条件的节点着色。

我有一个包含好边和坏边的数据框。好的边缘我设置列color = darkgrey,坏的边缘color = red

我的边缘列表看起来像:

      from     to    color
1    54770  54771 darkgrey
2    54770  54775 darkgrey
3    54770  54776 darkgrey
4    54770  54774 darkgrey
5    54771  54775 darkgrey
6    54771  54776 darkgrey
7    54771  54774      red
8    54775  54776 darkgrey
9    54775  54774 darkgrey
10   54776  54774 darkgrey
11  110780 110781      red

(为此,我 运行 列 dob_diff 上的以下行):

df$color <- with(df, ifelse(dob_diff <= 168), "red", "darkgrey"))

我可以绘制图形:

g = graph.data.frame(df, directed=FALSE)
plot(graph)

我可以 return 那些坏边的索引列表:

a <- which(df$colour == "red") 
> a
 [1]   7  11

我如何获取这些边,然后为连接到坏边的那些节点着色?

这道题说明你可以通过编号来访问节点颜色

V(g)$color[6] <- "red" 

如何告诉 igraph 获取边列表?

编辑:例如:

我可以return列出那些不正确的节点:

> from <- cluster_data_updated_illegal_combined[c("from")][cluster_data_updated_illegal_combined$illegal_dob == 1,]
> to <- cluster_data_updated_illegal_combined[c("to")][cluster_data_updated_illegal_combined$illegal_dob == 1,]

> from
 [1] "54771"  "110780" "20285"  "83962"  "88825"  "19695"  "33343"  "89446"  "90175"  "98032"  "115768"
[12] "1982"   "71327"  "75017"  "75018"  "89315"  "89316"  "106277" "106956" "111140" "32841"  "72276" 
[23] "111062" "111074" "1904"   "12148"  "17325"  "17412"  "18238"  "18368"  "19681"  "28041"  "30755" 
[34] "31915"  "32825"  "43791"  "54806"  "54808"  "87075"  "94814"  "97877"  "101124" "102311" "107659"
[45] "108778" "108906" "112029" "120840" "127396" "33371"  "90150"  "111095" "122230"
> to
 [1] "54774"  "110781" "20693"  "83961"  "88565"  "20338"  "33340"  "91043"  "90171"  "98035"  "115771"
[12] "1976"   "71439"  "75019"  "75020"  "89929"  "89929"  "106279" "107489" "111139" "32993"  "72272" 
[23] "111060" "111071" "2697"   "12090"  "17323"  "17413"  "20300"  "18561"  "20025"  "28046"  "30744" 
[34] "31587"  "33113"  "44067"  "54799"  "54803"  "87073"  "94816"  "97872"  "101122" "103480" "107679"
[45] "109013" "109256" "112246" "120842" "127401" "32679"  "90259"  "111028" "122228"

然后我尝试将这些节点的图形着色为红色,但出现错误:

> V(gg)[from]$color<-"red"
Error in unclass(x)[i] : invalid subscript type 'closure'
> V(gg)[to]$color<-"red"
Error in unclass(x)[i] : invalid subscript type 'closure'

你得到了什么:

您的边缘列表如下所示:

df <- read.table(header=T, text=" from     to    color
1    54770  54771 darkgrey
2    54770  54775 darkgrey
3    54770  54776 darkgrey
4    54770  54774 darkgrey
5    54771  54775 darkgrey
6    54771  54776 darkgrey
7    54771  54774      red
8    54775  54776 darkgrey
9    54775  54774 darkgrey
10   54776  54774 darkgrey
11  110780 110781      red")

这是图表:

library(igraph)
g = graph.data.frame(df, directed=FALSE)
plot(g)

这些是数据框中红色 ("bad") 边的索引:

which(df$color == "red") 
# [1]   7  11

您的问题:

How can I take these edges and then colour those nodes which are connected to the bad edges?

这是给连接到红色边缘的节点着色的一种方法:

vertices <- union(
  head_of(g, which(E(g)$color == "red")), 
  tail_of(g, which(E(g)$color == "red"))
)
plot(g, vertex.color = ifelse(V(g) %in% vertices, 6, 1))

参见例如?head_of。可能有 other/better 种方式。

Is there another column I can create with a different name that igraph can use to auto colour the nodes?

您可以将 color 属性分配给顶点 V(g) 以及边 E(g)

V(g)$color <- (V(g) %in% vertices) + 1L
plot(g)