我正在自动生成其节点需要处于固定位置的图形。例如:
从节点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的图形学习过程的结果,所以我不太确定如何生成可重现的示例。节点的位置是固定的,因为它们代表位置。我实际上需要一些魔法,某种重叠弧的检测:如果两个弧重叠,将其中一个稍微弯曲以便可以看到。我从链接的问题中知道弯曲弧是一种选择,所以我想也许这种魔法可以实现
答案 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
要将igraph
对象转换为qgraph可以使用的对象,您只需要一个edgelist或邻接矩阵:
g <- make_ring(9)
edgeList <- do.call(rbind, igraph::get.adjedgelist(g))
qgraph(edgeList)
如果您还想要包含轴,则可以使用axis()
来执行此操作,因为qgraph使用基本图形。但是,您可能还需要修改par()
以使其看起来不错。