Результат построения all_simple_paths (igraph, R) - PullRequest
0 голосов
/ 02 марта 2020

У меня есть большой пространственный объект igraph (2746 узлов / 3205 ребер), показывающий пути переноса наносов в водосборном бассейне. С помощью команды all_simple_paths я извлек все пути, которые начинаются в определенных исходных узлах и заканчиваются на выходе из водосбора (используя lapply). Результатом all_simple_paths является список из 1841 элемента, каждый из которых показывает идентификаторы вершин соответствующего пути. Сейчас я изо всех сил пытаюсь построить эти пути. Я хотел бы изобразить все пути пространственно и явно в одном изображении. Как подмножество графика, построенного всеми путями, которые достигают выхода.

«plot» выдает ошибку: Error in xy.coords(x, y, xlabel, ylabel, log) : 'x' is a list, but does not have components 'x' and 'y' Полный график, который я строю с помощью «ggraph», но для «графика выхода» также эта команда выдает ошибку: Error in create_layout.default(graph, layout, ...) : No layout function defined for objects of class list

Возможно, ее очень легко решить, но я уже пробовал различные возможности и не смог получить сюжет.

Здесь немного ( надеюсь, не слишком упрощенный) пример:

`library(igraph)

a <- c(1,2,2,3,4,4,7,7,7)
b <- c(2,3,10,4,5,6,8,9,3)
c <- c("rf","se","se","ft","fd","ft","st", "st","st")

edges <- cbind(a,b,c)

id <- c(1,2,3,4,5,6,7,8,9,10)
x <- c(623096,622839,622475,622581,622480,622376,620313,621551,621142,622927) 
y <- c(5149975,5150159,5150591,5151056,5151367,5151399,5150039,5150077,5150649,5150274)

nodes <- cbind(id,x,y)

my_graph <- graph_from_data_frame(edges, directed = TRUE,vertices = nodes)

plot(my_graph)

graph_outlet <- all_simple_paths(my_graph,from=1,to= 6,mode = "out")
plot (graph_outlet)`

Большое спасибо уже заранее!

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Мне удалось найти ответ самостоятельно;) Размещать его на тот случай, если у кого-нибудь один и тот же вопрос может возникнуть однажды.

Вот код, который я сейчас применил к полному набору данных. Результат «subbi» является объектом igraph, и, следовательно, его можно построить с помощью ggraph. (V_source - предопределенные исходные узлы, outlet_node - узел, на котором должны заканчиваться пути):

paths2 <- lapply(V_source[1:length(V_source)] , function(x) all_simple_paths(my_graph, x , to=outlet_node, mode = "out") )
A1 <- unlist(paths2, recursive = FALSE)
C <- list()
for (i in 1:length(A1)) {
  C[[i]] = E(graph=my_graph, path=A1[[i]])$ EdgeID 
}
seledges <- lapply(C, function(x) E(my_graph)[EdgeID %in% x])
subbi <- subgraph.edges(my_graph,unlist(seledges))


0 голосов
/ 02 марта 2020

Вы можете построить соответствующие пути, составив подграфы каждого пути в graph_outlet, например:

sub_graphs <- lapply(graph_outlet, function(vs) induced_subgraph(my_graph, vs))
plot(sub_graphs[[1]])

Помните, какие объекты возвращают различные функции igraph. Посмотрите на эти строки в вашем примере кода:

graph_outlet <- all_simple_paths(my_graph,from=1,to= 6,mode = "out")
class(graph_outlet[[1]])
class(my_graph)

Редактировать:

Я понял, что вы стремитесь визуализировать все пути в одном и том же граф. Я делаю небольшую манипуляцию с данными вашего примера, чтобы создать несколько путей между вершинами 1 и 6, а затем раскрасить вершины и ребра во всем графе, чтобы выделить пути:

# Your example data with path between 4-->10
a <- c(1,2,2,3,4,4,7,7,7,10)
b <- c(2,3,10,4,5,6,8,9,3,4)
c <- c("rf","se","se","ft","fd","ft","st", "st","st","st")
edges <- cbind(a,b,c)
id <- c(1,2,3,4,5,6,7,8,9,10)
x <- c(623096,622839,622475,622581,622480,622376,620313,621551,621142,622927) 
y <- c(5149975,5150159,5150591,5151056,5151367,5151399,5150039,5150077,5150649,5150274)
nodes <- cbind(id,x,y)
my_graph <- graph_from_data_frame(edges, directed = TRUE,vertices = nodes)

# Preferences
FROM_V <- 1
TO_V <- 6

# Calculate all simple paths from FROM_V to TO_V as list of vertecy sequences
graph_outlet <- all_simple_paths(my_graph,from=FROM_V,to=TO_V, mode = "out")

# Build sub-graphs to test
sub_graphs <- lapply(graph_outlet, function(vs) induced_subgraph(my_graph, vs))
plot(sub_graphs[[1]])

plot(my_graph)
# Colour and style vertecies
V(my_graph)$color <- "white"
V(my_graph)$color[unique(unlist(graph_outlet))] <- "gray"
V(my_graph)$color[c(FROM_V,TO_V)] <- "yellow"
# Colour each of the paths
E(my_graph)$color <- "gray"
lapply(graph_outlet, function(x) E(my_graph, path=x)$color <<- "black")

# Plot all paths and mark the group of vertecies through which paths flow
plot(my_graph)
plot(my_graph, mark.groups=unique(unlist(graph_outlet)))
...