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

问题描述 投票:0回答:1

我有一个大数据集,我想用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节点颜色与边缘颜色相匹配

谢谢你的帮助

r colors igraph
1个回答
0
投票

如果你 plot(G) 你会发现,数据框架对象的图形很可能不是你所期望的。这就是为什么你没有看到所有的边(即父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

© www.soinside.com 2019 - 2024. All rights reserved.