Соответствие вершины и цвета ребра в igraph - PullRequest
0 голосов
/ 04 мая 2020

У меня большой набор данных, который я хочу представить с помощью сетевого графика с помощью 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 для соответствия цвету края

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 04 мая 2020

если вы plot(G), вы увидите, что график объекта фрейма данных, скорее всего, не тот, который вы ожидаете. Вот почему вы не видите все ребра (то есть столбец Father_id вообще не используется).

По умолчанию igraph принимает первый столбец как «от», а второй - «до». Вот почему вы видите 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

...