Faktoriális grafikon elegáns megvalósítása

Elegant Implementation Factorial Tree Graph



Megoldás:

Frissítés 3: Az ExpressionGraph már elérhető a 12.1 -es verzióban.

Frissítés 2: egyszerűbb verzió a 2D grafikonokhoz:



ClearAll [g] g = GraphComputation`ExpressionGraph [ConstantArray [x, #], VertexLabels -> Nincs] &;

Példák:



g [Tartomány [2, 4]]

ide írja be a kép leírását



SetProperty [g [{3, 1, 3, 1, 2, 1, 4}], {GraphLayout -> 'RadialEmbedding', EdgeShapeFunction -> 'Line'}]

ide írja be a kép leírását

Eredeti válasz:

ClearAll [f] f [g_: Graph] [n_List, o: OptionsPattern []]: = g [UndirectedEdge @@@ [email protected] GraphComputation`ExpressionGraph [ConstantArray [x, n]], o, GraphLayout -> {' BalloonEmbedding '}, ImageSize -> Large] f [g_: Graph] [n_Integer, o: OptionsPattern []]: = f [g] [Range [2, n], o]

Példák:



f [] [6]

ide írja be a kép leírását

f [] [6, GraphLayout -> {'RadialEmbedding'}]

ide írja be a kép leírását

g1 = f [3D grafikon] [6]

ide írja be a kép leírását

g2 = f [Graph3D] [6, GraphLayout -> {'RadialEmbedding'}]

ide írja be a kép leírását

Használjon egy listát a csúcsok számáról minden rétegen argumentumként:

f [] [{3, 5, 2, 4}, GraphLayout -> {'RadialEmbedding', 'LayerSizeFunction' -> (# &)}]

ide írja be a kép leírását

Frissítés: ... hogy a Graph3D-t vegye és valahogy javítsa a high-n rétegek elrendezését: Úgy tűnik, sok a pazarolt hely.

A dobozarányok megváltoztatásának egyik módja a csúcsformák torzítása nélkül aVertexCoordinates segítségévelÁtméretezés:

SetProperty [g1, VertexCoordinates -> ScalingTransform [{1, 1, 3}] [[email protected]]]

ide írja be a kép leírását

SetProperty [g2, VertexCoordinates -> ScalingTransform [{1, 1, 3}] [[email protected]]]

ide írja be a kép leírását

Vagy adja hozzá az alopciót'LayerSizeFunction' in'RadialEmbedding':

g3 = f [Graph3D] [6, GraphLayout -> {'RadialEmbedding', 'LayerSizeFunction' -> (# &)}]; SetProperty [g3, VertexCoordinates -> ScalingTransform [{1, 1, -3}] [[email protected]]]

ide írja be a kép leírását

SetProperty [ #, VertexCoordinates -> ScalingTransform [{1, 1, 3}] [[email protected] #]] &@ f [Graph3D] [{3, 5, 2, 4}, GraphLayout -> {'RadialEmbedding', 'LayerSizeFunction'-> (#&)}]

ide írja be a kép leírását


Az IGraph/M már rendelkezik ezzel a beépített asIGSymmetricTree. Megadhatja az ágak számát minden szinten.

ide írja be a kép leírását

IGSymmetricTree [Tartomány [2, 4], DirectedEdges -> True, GraphLayout -> 'LayeredEmbedding']

ide írja be a kép leírását

A megvalósítás többnyire C -ben (nem Mathematica) történik, és ezúttal nem igraph -ból. Ezt egyszerűen egyszerűbb végrehajtani eljárási szempontból, amihez a C megfelelő. Ezért nem tiszta WL -ben csináltam.

Itt egy másik struktúra, minden szinten más számú ággal.

IGSymmetricTree [{5, 4, 3, 2}]

ide írja be a kép leírását


itt az én elegáns megvalósításom

l [c _]: = TakeList [[email protected] [k!, {k, c}], [email protected]!] [[c-1]]; T [x _]: = Grafikon [(F = Lapítás) @Táblázat [MapThread [#->#2 &, {[email protected] @Táblázat [[email protected], i], l [i+1]}], { i, 2, x+1}]]; [e -mail védett]

amely visszatér

ide írja be a kép leírását

de ha a Mathematica verziója nem támogatjaA TakeList itt egy másik módszer

s [x_]: = Összeg [k!, {k, x}]; z [y_]: = Partíció [Tartomány [[email protected]+1, s [y+1]], 1+y]; v [n_]: = táblázat [{Lapítás [z [n-1]] [[i]]-> z [n] [[i, j]]}, {i, n!}, {j, n+ 1}]; fa [t_]: = Grafikon [Lapítás [Tömb [[email protected] #&, t], 3]]; [e -mail védett]

ide írja be a kép leírását

[e -mail védett]

ide írja be a kép leírását