Как нарисовать классическую диаграмму состояния с помощью Mathematica? - PullRequest
20 голосов
/ 13 ноября 2011

Возможно и практично ли для Mathematica нарисовать что-то вроде этого (созданного Graphviz):

enter image description here

Это лучшее, что я могу получить (но форма истиль не удовлетворяет):

enter image description here

Код:

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

Ответы [ 2 ]

21 голосов
/ 13 ноября 2011

Вы можете сделать что-то подобное, используя 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


Метод Обновлено в феврале 2015

Чтобы сохранить возможность интерактивной перестановки графика с помощью инструментов рисования (двойной щелчок), необходимо сохранить графику вершин внутри GraphicsComplex, с индексами, а не координатами.Я полагаю, что можно сделать это из VertexRenderingFunction, используя инкрементную переменную, но, возможно, проще, возможно, более надежно сделать это с постобработкой.Это работает в версиях 7 и 10 Mathematica , предположительно также 8 и 9:

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

5 голосов
/ 13 ноября 2011

Нет необходимости в интерактивном размещении, чтобы получить вершины в нужном месте, как советует mr.Wizard в его ответе . Вы можете использовать VertexCoordinateRules для этого:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...