R自动化程序用于在网络图中放置循环。

3

我想绘制一个包含循环的圆形网络,即边的起点和终点在同一节点。如果节点之间有许多连接,则会出现问题,即循环始终绘制在右侧。这导致图形呈现非常不愉快。对于小型网络,可以手动解决此问题(例如,请参见此post)。

然而,对于可能不总是包含相同循环的大型网络,这变得更加困难。因此,我正在寻找一种自动化的方法(而不是上述手动过程),以始终将循环放置在网络的外部,以确保它们不会与绘图中的边重叠。

此问题的示例可能如下所示,其中特别是节点“g”,“h”,“i”以及在某种程度上“j”遭受此问题。该图仅限于包含权重大于5的边,以表明并非所有循环必须始终可用。

示例网络:

Example

复制网络的代码:

# packages
library(ggraph)
library(igraph)

# create example data
set.seed(123)
adj_mat <- matrix(runif(100, 0, 10), nrow=10)
colnames(adj_mat) <- letters[1:10]

# create graph object and remove edges below threshold
g <- graph_from_adjacency_matrix(adj_mat, weighted = T, diag = T)
g <- delete.edges(g, which(E(g)$weight < 5))

# plot
ggraph(g, layout = "circle") +
  geom_edge_link() +
  geom_edge_loop() +
  geom_node_circle(aes(r=0.1), fill = "orange") +
  geom_node_text(aes(label = colnames(adj_mat))) +
  theme(aspect.ratio = 1)

在此处添加您的投票:https://github.com/igraph/rigraph/issues/556 - Szabolcs
1个回答

6

使用 geom_edge_loop 时,可以使用direction 美学来改变循环的方向。默认值为45度,但是您可以使用边缘的 from(或等效的 to)属性来指定它。对于您的循环布局,这些数字是从3点钟位置逆时针编号的,每个节点的正确角度将是 (from - 1) * 360 / length(g)

ggraph(g, layout = "circle") +
  geom_edge_link() +
  geom_edge_loop(aes(direction = (from - 1) * 360 / length(g))) +
  geom_node_circle(aes(r = 0.1), fill = "orange") +
  geom_node_text(aes(label = colnames(adj_mat))) +
  theme(aspect.ratio = 1)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接