当与另一个弧重叠时自动弯曲弧
Automatically curving an arc when it is overlapping with another one
我正在自动生成其节点需要处于固定位置的图形。例如:
实际上从节点V4到节点V16有一条弧线,但是我们看不到它,因为从V4到V10和从V10到V16也有弧线。
请注意,节点和弧线都是自动生成的,并且位置可能会有所不同,因此我需要一种自动方式来弯曲隐藏在其他弧线后面的弧线.
另请注意,none 这些解决方案是有效的: ; Using igraph, how to force curvature when arrows point in opposite directions。第一个只是以某种方式放置 de 节点,但我的节点需要修复。第二个简单地处理节点对,这些节点有两条弧连接它们,方向相反。
更新:图的构造是使用 bnlearn 库形成 Bayesian Network 的图学习过程的结果,所以我不太确定如何生成可重现的示例。节点的位置是固定的,因为它们代表位置。我实际上需要一些魔法,某种重叠弧的检测:如果两条弧重叠,稍微弯曲其中一条以便可以看到。我从链接的问题中知道弯曲弧形是一种选择,所以我想也许可以实现这种魔法
一种解决方案是使用 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 可以使用的对象,您只需要一个边列表或邻接矩阵:
g <- make_ring(9)
edgeList <- do.call(rbind, igraph::get.adjedgelist(g))
qgraph(edgeList)
如果您还想包括坐标轴,您可以使用 axis()
来实现,因为 qgraph 使用基础图形。但是,您可能还需要修改 par()
以使其看起来更漂亮。
我正在自动生成其节点需要处于固定位置的图形。例如:
实际上从节点V4到节点V16有一条弧线,但是我们看不到它,因为从V4到V10和从V10到V16也有弧线。
请注意,节点和弧线都是自动生成的,并且位置可能会有所不同,因此我需要一种自动方式来弯曲隐藏在其他弧线后面的弧线.
另请注意,none 这些解决方案是有效的:
更新:图的构造是使用 bnlearn 库形成 Bayesian Network 的图学习过程的结果,所以我不太确定如何生成可重现的示例。节点的位置是固定的,因为它们代表位置。我实际上需要一些魔法,某种重叠弧的检测:如果两条弧重叠,稍微弯曲其中一条以便可以看到。我从链接的问题中知道弯曲弧形是一种选择,所以我想也许可以实现这种魔法
一种解决方案是使用 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 可以使用的对象,您只需要一个边列表或邻接矩阵:
g <- make_ring(9)
edgeList <- do.call(rbind, igraph::get.adjedgelist(g))
qgraph(edgeList)
如果您还想包括坐标轴,您可以使用 axis()
来实现,因为 qgraph 使用基础图形。但是,您可能还需要修改 par()
以使其看起来更漂亮。