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

D1X*_*D1X 6 r igraph

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

具有固定节点的图

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

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


另请注意,这些解决方案都不是有效的:igraph:解决紧密重叠的节点 ; 使用igraph,如何在箭头指向相反方向时强制弯曲.第一个只是以某种方式放置de节点,但我的节点需要修复.第二个简单地处理具有两个连接它们的相反方向的节点对.


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

Van*_*man 5

一种解决方案是使用该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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

g <- make_ring(9)
edgeList <- do.call(rbind, igraph::get.adjedgelist(g))
qgraph(edgeList)
Run Code Online (Sandbox Code Playgroud)

如果您还想包含轴,则可以使用 qgraph 来实现,axis()因为 qgraph 使用基础图形。但是,您可能还需要进行修改par()才能使其看起来更漂亮。