Layout grafico a strati personalizzato
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
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] &