Пример:
require(igraph)
require(tidygraph)
require(ggraph)
require(data.table)
nodes <- data.table(id = 1:6,
label = c("a1", "b1", "a2", "a3", "b2", "a4"),
type = c("A", "B", "A", "A", "B", "A"))
edges <- data.table(from = c(1, 2, 2, 3, 5),
to = c(2, 3, 4, 5, 6))
network <- graph_from_data_frame(d = edges, vertices = nodes, directed = TRUE)
ggraph(network) +
geom_edge_link(arrow = arrow(length = unit(4, 'mm')),
start_cap = circle(3, 'mm'),
end_cap = circle(3, 'mm')) +
geom_node_point(aes(color = type), size = 7) +
geom_node_text(aes(label = label)) +
theme_graph()
Вот что мы получаем:
![enter image description here](https://i.stack.imgur.com/AcSyV.png)
Затем мы создаем проекции:
V(network)$type <- bipartite_mapping(network)$type
network_projections <- bipartite_projection(network)
ggraph(network_projections$proj1) +
geom_edge_link(arrow = arrow(length = unit(4, 'mm')),
start_cap = circle(3, 'mm'),
end_cap = circle(3, 'mm')) +
geom_node_point(size = 7, color = 2, alpha = .6) +
geom_node_text(aes(label = label)) +
theme_graph()
И вот что мы получаем:
![enter image description here](https://i.stack.imgur.com/DNi6H.png)
Проекция показывает ссылку a2 -> a3, которая должна не будь там.Что явно означает, что направленность не была принята во внимание.
Насколько я выяснил, базовая матрица инцидентности, вычисленная библиотекой igraph
, рассчитывается таким образом, что не учитывает направленность.Есть ли какая-то функция, которую я пропустил, или другие библиотеки R, которые позволяют направленно проецировать двудольные сети?