Layout grafico a strati personalizzato

Oct 10 2020

Vorrei scrivere un programma per disegnare un grafico prendendo come input la dimensione degli strati e dei bordi del grafico. ad esempio per i bordi = {} e Layers = {3,3,5,1} mi aspetto qualcosa di simile

Ho usato questo codice per generare la trama ma (i) ovviamente sto solo usando il `` trucco '' di colorare i bordi allo stesso modo dello sfondo solo per posizionare i vertici dove li voglio, cosa che è computazionalmente costosa da fare , specialmente per un numero maggiore di vertici, e (ii) non so davvero come specificare i bordi ora.

Layers = {3, 3, 5, 1} // Sort[#, Greater] &;
Graph[CompleteGraph[Total[Layers], EdgeStyle -> White], VertexSize -> Large, GraphLayout -> {"MultipartiteEmbedding", "VertexPartition" -> Layers}]

Quindi, la mia domanda si riduce a: (i) C'è un modo migliore per forzare la dimensione dei livelli e (ii) come specificare i bordi all'interno di questo nuovo layout.

Risposte

3 kglr Oct 10 2020 at 07:44
Layers = {3, 3, 5, 1} // Sort[#, Greater] &;

g0 = Graph[Range @ Total@Layers, {}, VertexSize -> Large, 
 VertexCoordinates -> GraphEmbedding[CycleGraph[Total[Layers]],
     {"MultipartiteEmbedding", "VertexPartition" -> Layers}]]

EdgeList  @ g0
 {}

Non sono sicuro di aver compreso il bit "come specificare i bordi all'interno di questo nuovo layout" ; forse qualcosa di simile al seguente?

Graph[EdgeAdd[g0, {2 -> 5, 3 -> 8, 7 -> 12}], 
 EdgeShapeFunction -> GraphElementData[{"CurvedArc", "Curvature" -> 2/3}], 
 VertexLabels -> Placed["Name", Center]]

Aggiornamento: puoi anche costruire una funzione di layout multi-partita e usarla per specificare le coordinate del vertice:

ClearAll[mPartiteLayout]
mPartiteLayout[s_: N[GoldenRatio]] := Module[{xc = Subdivide[Length@# - 1],
     yc = Rescale[Range[(1 - #)/2, (# - 1)/2] & /@ #]/s},
    Join @@ (Thread /@ Transpose[{xc, yc}])] &;

Graph[Range @ Total @ Layers, {}, VertexSize -> Large, 
 VertexCoordinates -> mPartiteLayout[] @ Layers]

SeedRandom[77];
nl = RandomInteger[{5, 20}, 12];
Graph[Range @ Total @ #, {}, VertexSize -> Large, 
    VertexCoordinates -> mPartiteLayout[] @ #, PlotLabel -> #, 
    ImageSize -> 250] & /@ (RandomInteger[{1, 10}, #] & /@ nl) // 
 Grid[Partition[#, 4], Dividers -> All] &