【问题标题】:Change Vertex Node colour for specific edge igraph R更改特定边缘 igraph R 的顶点节点颜色
【发布时间】:2017-11-24 09:31:04
【问题描述】:

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

我有一个包含好坏边缘的数据框。好的边缘我设置列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)

我可以通过以下方式返回那些坏边的索引列表:

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

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

这个问题here表示您可以通过编号访问节点颜色

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

如何告诉 igraph 获取边列表?

编辑:例如:

我可以返回不正确的节点列表:

> 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'

【问题讨论】:

  • 旁注:在以后的帖子中,我建议您#1 使用dputread.table(请参阅我的回答)或类似的方式提供您的数据,这样便于读者复制您的问题; #2 删掉赘肉(减少文本/更多重点,删除与问题无关的所有内容,例如所有plot 参数,...)。

标签: r for-loop graph igraph


【解决方案1】:

你得到了什么:

您的边缘列表如下所示:

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)

这些是数据框中红色(“坏”)边的索引:

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

您的问题:

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

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

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。可能还有其他/更好的方法。

我可以用不同的名称创建另一列吗? igraph 可以用来自动着色节点吗?

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

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

【讨论】:

  • 谢谢卢克A。太棒了。我很欣赏你对原始 Q 混乱的态度。
  • @Chuck 是as.integer(V(g) %in% vertices) + 1L 的缩写。 V(g) %in% vertices 给出了一个逻辑向量(TRUE/FALSE 值),它不适用于颜色编码。转换为数字时,FALSE 给出 0,在 igraph 的默认调色板中为白色(或透明)。 1,标准,是橙色,2是蓝色。添加 1 只是防止白色顶点。 L 表示整数,1 单独表示数字。
  • 谢谢卢克。欣赏它。