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)
问题是b和c(或c和b)之间的箭头.
除了手动指定曲率,任何建议?
Pie*_*nte 12
我会使用edged.curved
与seq
autocurve.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)