我有一个大数据集,我想用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节点颜色与边缘颜色相匹配
谢谢你的帮助
如果你 plot(G)
你会发现,数据框架对象的图形很可能不是你所期望的。这就是为什么你没有看到所有的边(即父ID列根本没有被使用)。
默认情况下,igraph把第一列作为 "from",第二列作为 "to"。这就是为什么你看到的是1to0,2to0等等。
你可以通过传入两个对象来解决这个问题,一个是边和它们的属性,另一个是节点和它们的属性。不过,你的代码应该是这样的。
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)