如何为二部图创建同心布局

时间:2018-11-20 04:36:20

标签: r layout graph igraph bioconductor

我有一个像这样的二部图,我想要一个属性在外圆上,而另一个属性在内圆上,或者在外圆内。

enter image description here

据此question Bioconductor可以做类似的事情,但是我不知道字体等的可自定义性。还有其他方法为二部图创建同心布局吗?

1 个答案:

答案 0 :(得分:0)

igraph有一个bipartite layout,它试图最小化边缘交叉。您可以运行此布局,提取坐标,然后将它们环绕在一个圆上。

我对R的经验不足,无法花时间向您展示R界面的实现方式。但是我可以使用igraph的Mathematica界面向您展示完成后的外观。

<< IGraphM`

IGraph/M 0.3.103 (November 13, 2018)

Evaluate IGDocumentation[] to get started.

生成一个稀疏随机二分图,获取其最大的连接部分,然后运行布局。如果图形不是稀疏的,则将无法避免边缘穿过圆心。

IGSeedRandom[4];
bg = IGGiantComponent@IGBipartiteGameGNM[100, 100, 220];
bg = IGLayoutBipartite[bg, "BipartitePartitions" -> IGBipartitePartitions[bg]]

enter image description here

提取坐标,并将其包裹在两个圆周围。

pts = GraphEmbedding[bg]; (* get vertex coordinates *)

{m1, m2} = Max /@ Values@GroupBy[pts, First -> Last]; (* find max coordinate for both vertex groups *)

newPts = If[#1 == -1,
     2 {Cos[#2/m1 2 Pi], Sin[#2/m1 2 Pi]},
     3 {Cos[#2/m2 2 Pi], Sin[#2/m2 2 Pi]}
   ] & @@@ pts; (* wrap both groups around a circle *)

Graph[VertexList[bg], EdgeList[bg], VertexCoordinates -> newPts]

enter image description here

上面使用的圆弧半径比为3:2。半径比越大,穿过内圆的边越少。这是比例为3:1的地块。

enter image description here