igraph имеет двудольный макет , который пытается минимизировать пересечения краев.Вы можете запустить этот макет, извлечь координаты, а затем обернуть их вокруг круга.
Я недостаточно опытен с R, чтобы иметь возможность показать вам, как это делается с помощью интерфейса R.Но я могу показать вам, как это будет выглядеть, когда вы закончите, используя интерфейс Mathematica igraph.
<< 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.