匹配igraph中的顶点和边缘颜色

时间:2020-05-04 16:10:20

标签: r colors igraph

我有一个大的数据集,我想用igraph用网络图表示。我只是不明白如何正确选择颜色。是否有可能获得具有与顶点颜色相同颜色的边缘的igraph图?在下面的示例中,我想根据状态“已采样”或“未采样”为顶点和边缘着色。另一个问题是所有边缘都没有出现在igraph上,我也不明白为什么

到目前为止,我的代码是:

d <- data.frame(individual=c(1:10), mother_id = c(0,0,0,0,0,1,3,7,6,7), father_id = c(0,0,0,0,0,4,1,6,7,6) , generation = c(0,0,0,0,0,1,1,2,2,2), status=c("sampled","unsampled","unsampled","sampled",'sampled',"sampled","unsampled","unsampled","sampled",'sampled'))

#Just some settings for layout plot
g <- d$generation
n <- nrow(d)
pos <- matrix(data = NA, nrow = n, ncol = 2)
pos[, 2] <- max(g) - g
pos[, 1] <- order(g, partial = order(d$individual, decreasing = TRUE)) - cumsum(c(0, table(g)))[g + 1]

#Plotting the igraph
G <- graph_from_data_frame(d)
plot(G, rescale = T, vertex.label = d$individual, layout = pos,
edge.arrow.mode = "-",
vertex.color = d$status,
edge.color = d$status,
asp = 0.35)

我的问题与这个问题有些相似,但是我想使用igraph软件包来做。 Ggraph node color to match edge color

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

如果您plot(G),您很可能会发现数据框对象中的图形不是您所期望的。这就是为什么您看不到所有边的原因(即根本没有使用father_id列)。

默认情况下,igraph将第一列作为“ from”,将第二列作为“ to”。这就是为什么您看到1to0、2to0等的原因。

enter image description here

您可以通过传入两个对象来解决此问题,一个对象带有边缘及其属性,另一个对象带有节点及其属性。 我不清楚边缘应该在哪里。但是,您的代码应如下所示:

dd <- read.table(text = "
from to type
1 6 A
3 7 B
7 8 A
6 9 B
7 10 A
4 6 B
1 7 A
6 8 B
7 9 B
6 10 A ", header=T )

nodes <- data.frame(id=unique(c(dd$from, dd$to)) )
nodes$type <- sample(LETTERS[1:2], 8, replace = T  )
nodes$x <- c(8,3,5,7,1,2,4,10) # this if for the layout
nodes$y <- c(1, 2, 4, 5, 6, 8, 5, 7)

    nodes
  id type  x y
1  1    B  8 1
2  3    A  3 2
3  7    B  5 4
4  6    A  7 5
5  4    A  1 6
6  8    B  2 8
7  9    A  4 5
8 10    A 10 7

G <- graph_from_data_frame(dd, vertices = nodes ) # directed T or F?

V(G)$color <- ifelse( V(G)$type == "A", "pink", "skyblue")
E(G)$color <- ifelse( E(G)$type == "A", "pink", "skyblue")

edge_attr(G)
vertex_attr(G)
plot(G)

enter image description here