使用igraph,如何在箭头指向相反方向时强制弯曲

Eti*_*rie 10 plot r igraph

autocurve.edges在igraph图中弯曲边缘做了一个了不起的工作,这样当它们指向同一方向时它们不会重叠.但是,当它们指向相反的方向时,不会施加曲率.

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")
Run Code Online (Sandbox Code Playgroud)

igraph与叠加的箭头指向相反的方向

问题是b和c(或c和b)之间的箭头.

除了手动指定曲率,任何建议?

Pie*_*nte 12

我会使用edged.curvedseqautocurve.edges使用相同的调用选项.

plot(graph,
     vertex.color="white", edge.curved=seq(-0.5, 0.5, length = ecount(graph)))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑:

正如Étienne指出的那样,该解决方案还可以对独特观察的边缘进行曲线拟合.然后解决方案是修改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
}
Run Code Online (Sandbox Code Playgroud)

这是添加单个非相互边缘(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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述