Benutzerdefiniertes Layered Graph Layout
Ich möchte ein Programm schreiben, um ein Diagramm zu zeichnen, wobei die Größe der Ebenen und die Kanten des Diagramms als Eingabe verwendet werden. zB Für Kanten = {} und Ebenen = {3,3,5,1} würde ich so etwas erwarten
Ich habe diesen Code verwendet, um das Diagramm zu generieren, aber (i) ich verwende natürlich nur den "Trick", die Kanten genauso wie den Hintergrund zu färben, um die Scheitelpunkte dort zu platzieren, wo ich sie haben möchte - was rechenintensiv ist , insbesondere für eine größere Anzahl von Eckpunkten, und (ii) ich weiß nicht wirklich, wie ich die Kanten jetzt spezifizieren soll.
Layers = {3, 3, 5, 1} // Sort[#, Greater] &;
Graph[CompleteGraph[Total[Layers], EdgeStyle -> White], VertexSize -> Large, GraphLayout -> {"MultipartiteEmbedding", "VertexPartition" -> Layers}]
Dann reduziert sich meine Frage auf: (i) Gibt es eine bessere Möglichkeit, die Größe der Ebenen zu erzwingen, und (ii) wie die Kanten in diesem neuen Layout angegeben werden.
Antworten
Layers = {3, 3, 5, 1} // Sort[#, Greater] &;
g0 = Graph[Range @ Total@Layers, {}, VertexSize -> Large,
VertexCoordinates -> GraphEmbedding[CycleGraph[Total[Layers]],
{"MultipartiteEmbedding", "VertexPartition" -> Layers}]]
EdgeList @ g0
{}
Ich bin mir nicht sicher, ob ich verstehe, wie die Kanten in diesem neuen Layout angegeben werden . vielleicht so etwas wie das folgende?
Graph[EdgeAdd[g0, {2 -> 5, 3 -> 8, 7 -> 12}],
EdgeShapeFunction -> GraphElementData[{"CurvedArc", "Curvature" -> 2/3}],
VertexLabels -> Placed["Name", Center]]
Update: Sie können auch eine mehrteilige Layoutfunktion erstellen und damit Scheitelpunktkoordinaten angeben:
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] &