С помощью igraph, как вызвать кривизну, когда стрелки указывают в противоположных направлениях

autocurve.edges отлично справляется с изгибом краев графических графиков, чтобы они не перекрывались, когда они указывают в одном направлении. Однако, когда они указывают в противоположных направлениях, кривизна не применяется.

d <- data.frame(start=c("a","a","b","c"),end=c("b","b","c","b"))


graph <- graph.data.frame(d, directed=T)

plot(graph,
     vertex.color="white")

график с наложенными стрелками, указывающими в противоположных направлениях

Проблема заключается в стрелках между b и c (или c и b).

Какие-либо предложения, кроме указания кривизны вручную?


person Etienne Low-Décarie    schedule 01.06.2013    source источник


Ответы (1)


Я бы использовал параметр edge.curved с тем же вызовом seq, который использует autocurve.edges.

plot(graph,
     vertex.color="white", edge.curved=seq(-0.5, 0.5, length = ecount(graph)))

введите описание изображения здесь

РЕДАКТИРОВАТЬ:

Как указал Этьен, это решение также искривляет края для уникальных наблюдений. Решение состоит в том, чтобы изменить функцию autocurve.edges. Это моя модифицированная функция под названием autocurve.edges2. По сути, он генерирует вектор, который искривляет только неуникальные ребра.

autocurve.edges2 <-function (graph, start = 0.5)
{
    cm <- count.multiple(graph)
    mut <-is.mutual(graph)  #are connections mutual?
    el <- apply(get.edgelist(graph, names = FALSE), 1, paste,
        collapse = ":")
    ord <- order(el)
    res <- numeric(length(ord))
    p <- 1
    while (p <= length(res)) {
        m <- cm[ord[p]]
        mut.obs <-mut[ord[p]] #are the connections mutual for this point?
        idx <- p:(p + m - 1)
        if (m == 1 & mut.obs==FALSE) { #no mutual conn = no curve
            r <- 0
        }
        else {
            r <- seq(-start, start, length = m)
        }
        res[ord[idx]] <- r
        p <- p + m
    }
    res
}

И вот результат при добавлении единственного несовпадающего ребра (C- ›D):

library(igraph)
d <- data.frame(start=c("a","a","b","c","c"),end=c("b","b","c","b","d"))
graph <- graph.data.frame(d, directed=T)
curves <-autocurve.edges2(graph)
plot(graph, vertex.color="white", edge.curved=curves)

введите описание изображения здесь

person Pierre Lapointe    schedule 01.06.2013
comment
Это отличный шаг в правильном направлении! Спасибо. Однако это приводит к изгибу всех кромок, даже уникальных кромок. - person Etienne Low-Décarie; 02.06.2013
comment
Я только что нашел эту функцию. Действительно мило. Спасибо. - person stanekam; 15.01.2014
comment
Действительно приятная функция. Спасибо и мне! - person Blind0ne; 04.04.2019