Comment dessiner le diagramme d'état classique en utilisant Mathematica?

est-il possible et pratique pour Mathematica de dessiner quelque chose comme ceci (étant créé par Graphviz):

enter image description here

C'est le meilleur que je peux obtenir (mais la forme et le style ne sont pas satisfaisantes):

enter image description here

Code:

GraphPlot[{{A -> C, "go"}, {C -> B, "gone"}, {C -> D, 
   "went"}, {C -> C, "loop"}}, VertexLabeling -> True, 
 DirectedEdges -> True]
20
demandé sur Ning 2011-11-13 07:24:41

2 réponses

vous pouvez faire quelque chose comme ça en utilisant VertexRenderingFunction .

GraphPlot[{{A -> C, "go"}, {C -> B, "gone"}, {C -> D, "went"}, {C -> C, "loop"}}, 
 DirectedEdges -> True, 
 VertexRenderingFunction -> ({{White, Disk[#, 0.15]}, 
     AbsoluteThickness[2], Circle[#, 0.15], 
     If[MatchQ[#2, A | B], Circle[#, 0.12], {}], Text[#2, #]} &)]

enter image description here


Méthode Mise À Jour Février 2015

pour préserver la possibilité de réarranger interactivement le graphe avec les outils de dessin (double clic) il faut garder les graphiques de sommet à l'intérieur de GraphicsComplex , avec des index plutôt que des coordonnées. Je crois que l'on pourrait faire, ce de VertexRenderingFunction en utilisant une variable incrementing mais il semble plus facile un peut-être plus robuste pour le faire avec le post-traitement. Cela fonctionne dans les versions 7 et 10 de Mathematica , probablement 8 et 9 ainsi:

GraphPlot[
  {{A -> C, "go"}, {C -> B, "gone"}, {C -> D, "went"}, {C -> C, "loop"}},
  DirectedEdges -> True
] /.
 Tooltip[Point[n_Integer], label_] :>
   {{White, Disk[n, 0.15]},
    Black, AbsoluteThickness[2], Circle[n, 0.15], 
    If[MatchQ[label, A | B], Circle[n, 0.12], {}], Text[label, n]}

enter image description here

21
répondu Mr.Wizard 2015-02-23 07:28:01

il n'y a pas besoin de placement interactif pour obtenir vos sommets à l'endroit désiré comme mr.Wizard suggère dans sa réponse . Vous pouvez utiliser VertexCoordinateRules pour cela:

GraphPlot[{{A -> C, "go"}, {C -> B, "gone"}, {C -> D, "went"}, {C -> C, "loop"}}, 
    DirectedEdges -> True, 
    VertexRenderingFunction -> 
          ({{White, Disk[#, 0.15]}, AbsoluteThickness[2], Circle[#, 0.15], 
           If[MatchQ[#2, A | B], Circle[#, 0.12], {}], Text[#2, #]} &),
    VertexCoordinateRules -> 
          {A -> {0, 0}, C -> {0.75, 0},B -> {1.5, 0.25}, D -> {1.5, -0.25}}
]

enter image description here

5
répondu Sjoerd C. de Vries 2017-05-23 12:01:11