【问题标题】:R igraph vertex coloringR igraph 顶点着色
【发布时间】:2018-04-14 16:47:02
【问题描述】:

我正在尝试根据虚拟变量 [color_thresh] 为顶点着色。数据如下所示:

我尝试了几种建议的方法,但我能做的最接近(也是最简单)的方法如下:

这是我复制数据的代码和上图:

library(igraph)
library(data.tree)

Level_0 = c("TAC_310B_124","TAC_310B_124","TAC_310B_124","TAC_310B_124","TAC_310B_124","TAC_310B_124","TAC_310B_124","TAC_310B_124","TAC_310B_124")
Level_1 = c("","SC_776E_86","SS_A66D_9","SC_776E_86","SC_776E_86","SC_776E_86","SC_776E_86","SC_776E_86","SC_776E_86")
Level_2 = c("","","","TGW_1DD0_42","TGW_1DD0_42","TGW_1DD0_42","TGW_1DD0_42","TGW_1DD0_42","TGW_1DD0_42")
Level_3 = c("","","","","CORB_F2E4_17","CORB_F2E4_22","CORB_AE16_10921","CORB_AE16_10921","CORB_AE16_10921")
Level_4 = c("","","","","","","","CORB_D81E_45","CORB_D81E_45")
Level_5 = c("","","","","","","","","SC_B949_3156")
color_thresh = c(1,0,0,0,0,0,1,0,1)

dataset <- data.frame(Level_0,Level_1,Level_2,Level_3,Level_4,Level_5,color_thresh)

dataset$pathString <- paste(dataset$Level_0, 
                            dataset$Level_1, 
                            dataset$Level_2, 
                            dataset$Level_3, 
                            dataset$Level_4, 
                            dataset$Level_5, 
                            sep = "/")

g <- as.Node(dataset)
g <- as.igraph(g, directed=TRUE)

V(g)$color <- ifelse(dataset$color_thresh==1, "red", "green")

plot.igraph(g, vertex.label.color="black", vertex.label.dist=0, vertex.label.family="Helvetica", vertex.frame.color="white", vertex.size=25, layout=layout_as_tree)

当我按 [color_thresh] 对数据框进行排序时,颜色会发生变化,但仍然没有给我正确的颜色。 任何帮助我理解条件着色如何工作的 cmets 都非常感谢!非常感谢您。

【问题讨论】:

  • 你必须根据你的节点对颜色进行排序。
  • 感谢您的评论,patL,但您能更具体一点吗?如何根据节点对颜色进行排序?
  • 如果您生成了一个名为colors 的颜色矢量,则可以使用V(g)$color[colors] 完成,它会根据颜色矢量对颜色进行排序。
  • @Daniel Safai 用另一种方法编辑了我的答案
  • 第一种方法更好,因为 color_thresh 变量是动态的,因此图形必须使用最新值更新颜色。再次感谢!我永远不会想出像你第一个那样优雅的解决方案。

标签: r igraph


【解决方案1】:

这是一种方法:

g <- as.Node(dataset)
g <- as.igraph(g, directed=TRUE)

检查节点的排序方式

g_data <-  get.data.frame(g,  what="vertices")$name

查看节点在数据中的排序方式:

data_vert <- apply(dataset[1:6], 1, function(x) tail(x[x!=""], 1))

根据节点对数据进行排序并应用颜色

 V(g)$color <- ifelse(dataset$color_thresh[match(g_data , data_vert)] == 1, "red", "green")


plot.igraph(g, vertex.label.color="black", vertex.label.dist=0, vertex.label.family="Helvetica", vertex.frame.color="white", vertex.size=25, layout=layout_as_tree)

这是正确的颜色编码吗?

另一种方法是明确说明哪些节点应该具有哪种颜色:

g <- as.Node(dataset)
g <- as.igraph(g, directed = TRUE)

V(g)$color <- "green" 
V(g)["TAC_310B_124"]$color <- "red"
V(g)["SC_B949_3156" ]$color <- "red"
V(g)["CORB_AE16_10921"]$color <- "red" 

相同的输出图像

【讨论】: