Автоматически изгибать дугу, когда она перекрывается с другой
Я автоматически генерирую графики, узлы которых должны быть в фиксированных положениях. Например:
На самом деле есть дуга от узла V4 до узла V16, но мы не видим ее, потому что есть также дуги от V4 до V10 и от V10 до V16.
Обратите внимание, что как узлы, так и дуги генерируются автоматически, и что позиции могут изменяться, поэтому мне потребуется автоматический способ изгибать дуги, которые скрыты за другими дугами.
Также обратите внимание, что ни одно из этих решений не является действительным: igraph: разрешение узких перекрывающихся узлов; Используя igraph, как заставить кривизну, когда стрелки указывают в противоположных направлениях. Первый просто размещает узлы определенным образом, но мои узлы должны быть исправлены. Второй просто имеет дело с парами узлов, у которых есть две дуги, соединяющие их в противоположном направлении.
ОБНОВЛЕНИЕ: Построение графа является результатом процесса обучения графа, который формирует байесовскую сеть с использованием библиотеки bnlearn, поэтому я не очень уверен, как я могу привести воспроизводимый пример. Позиции узлов фиксированы, потому что они представляют позиции. Мне действительно нужно какое-то волшебство, какое-то обнаружение перекрывающихся дуг: если две дуги перекрываются, слегка изогните одну из них, чтобы ее можно было увидеть. Я знаю из связанных вопросов, что изгиб дуги - это вариант, поэтому я подумал, что, возможно, такого рода магии можно достичь
1 ответ
Одним из решений будет использование qgraph
пакет. В приведенном ниже примере он автоматически изгибает двунаправленные ребра:
library(igraph)
library(qgraph)
# the raster layout
layout <- cbind(1:3, rep(1:3, each = 3))
# fully connected network
adj <- matrix(1, 9, 9)
# plot directed and undirected network
layout(matrix(1:2, 1, 2))
qgraph(adj, layout = layout, directed = FALSE, title = "undirected")
qgraph(adj, layout = layout, directed = TRUE, title = "directed") # automatically curves the bidirectional arrows
Чтобы преобразовать igraph
объект для чего-то, что может использовать qgraph, все что вам нужно - это список ребер или матрица смежности:
g <- make_ring(9)
edgeList <- do.call(rbind, igraph::get.adjedgelist(g))
qgraph(edgeList)
Если вы также хотите включить оси, вы можете сделать это, используя axis()
поскольку qgraph использует базовую графику. Тем не менее, вам, вероятно, придется повозиться с par()
а также чтобы он выглядел красиво.