wolfram-mathematicadrawingstate-diagram

How to draw the classic state diagram using Mathematica?


Is it possible and practical for Mathematica to draw something like this (being created by Graphviz):

enter image description here

This is the best that I can get (but the shape and style are not satisfying):

enter image description here

Code:

GraphPlot[{{A -> C, "go"}, {C -> B, "gone"}, {C -> D, 
   "went"}, {C -> C, "loop"}}, VertexLabeling -> True, 
 DirectedEdges -> True]

Solution

  • You can do something like this using 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


    Method Updated February 2015

    To preserve the ability to interactively rearrange the graph with the drawing tools (double click) one must keep the vertex graphics inside of GraphicsComplex, with indexes rather than coordinates. I believe one could do this from VertexRenderingFunction using an incrementing variable but it seems easier an possibly more robust to do it with post-processing. This works in versions 7 and 10 of Mathematica, presumably 8 and 9 as well:

    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