我有一个像这样的二部图,我想要一个属性在外圆上,而另一个属性在内圆上,或者在外圆内。
据此question Bioconductor可以做类似的事情,但是我不知道字体等的可自定义性。还有其他方法为二部图创建同心布局吗?
答案 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]]
提取坐标,并将其包裹在两个圆周围。
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]
上面使用的圆弧半径比为3:2。半径比越大,穿过内圆的边越少。这是比例为3:1的地块。