当弧与另一个弧重叠时自动弯曲弧

时间:2017-08-16 19:45:11

标签: r igraph

我正在自动生成其节点需要处于固定位置的图形。例如:

Graph with fixed nodes

从节点V4到节点V16实际上存在一个弧,但我们没有看到它,因为还有从V4到V10以及从V10到V16的弧。

请注意,节点和弧都是自动生成的,并且位置可能会有所不同,因此我需要一种自动方式来弯曲隐藏在其他弧后面的弧。

另请注意,这些解决方案均无效:igraph: Resolving tight overlapping nodes; Using igraph, how to force curvature when arrows point in opposite directions。第一个只是以某种方式放置de节点,但我的节点需要修复。第二个简单地处理成对的节点,这些节点有两个连接它们的弧线朝相反的方向运行。

更新:图形的构造是使用bnlearn库形成Bayesian Network的图形学习过程的结果,所以我不太确定如何生成可重现的示例。节点的位置是固定的,因为它们代表位置。我实际上需要一些魔法,某种重叠弧的检测:如果两个弧重叠,将其中一个稍微弯曲以便可以看到。我从链接的问题中知道弯曲弧是一种选择,所以我想也许这种魔法可以实现

1 个答案:

答案 0 :(得分:3)

一种解决方案是使用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

enter image description here

要将igraph对象转换为qgraph可以使用的对象,您只需要一个edgelist或邻接矩阵:

g <- make_ring(9)
edgeList <- do.call(rbind, igraph::get.adjedgelist(g))
qgraph(edgeList)

如果您还想要包含轴,则可以使用axis()来执行此操作,因为qgraph使用基本图形。但是,您可能还需要修改par()以使其看起来不错。