我正在尝试创建一个特殊的图形布局,其中 2 种不同类型的节点(基于其属性)放置在具有不同半径的 2 个不同的圆上(同心圆布局)。
这是一个玩具示例,其中具有 10 个节点的图具有一个属性(大小)。目标是将大小小于 5 的节点放置在内圆上,将大小大于 5 的节点放置在外圆上:
g <- make_full_graph(10)
V(g)$size = V(g)
我找不到 igraph 库支持的任何此类布局。有谁知道如何实现这一目标?
如果您只想要一个圆圈,可以选择
layout_in_circle
选项。您可以使用类似的方法将其单独应用于每个组
layout_in_circles <- function(g, group=1) {
layout <- lapply(split(V(g), group), function(x) {
layout_in_circle(induced_subgraph(g,x))
})
layout <- Map(`*`, layout, seq_along(layout))
x <- matrix(0, nrow=vcount(g), ncol=2)
split(x, group) <- layout
x
}
然后你可以用
绘图plot(g, layout=layout_in_circles(g, group=V(g)>5))
尝试使边缘漂亮并没有什么特别的作用。但我想重点是你可以通过返回坐标矩阵来定义你想要控制布局的任何函数。
请注意,R 包中现在还有一个同心圆函数
{manynet}
。 (这依赖于优秀的 {ggraph}
和 {Rgraphviz}
包进行绘图,但为最常见的图形类型对象实现了附加方法。)以下是复制 MrFlick 解决方案的代码:
g <- create_filled(10) |> mutate(size = 1:10, circle = size > 5)
autographr(g, layout = "concentric", membership = "circle",
node_size = "size", node_color = "circle")
同心布局的“membership”参数可以采用各种属性或向量,并且布局可以扩展到超过2个圆/层。