2011-11-13 47 views
20

是否有可能和實際的數學來繪製這樣的事情(由Graphviz的創建):如何使用Mathematica繪製經典狀態圖?

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] 
+0

沒有理由不能使用基本圖形繪製這樣的事情。您是否要求自動佈局解決方案? –

+1

@ Mr.Wizard是的,我正在尋找一些更高級的基元來繪製複雜的狀態圖。我不知道Mathematica是否提供這個功能。我通過文檔搜索並檢查了「GraphPlot」函數的選項,並以上面的代碼結束。 – Ning

+0

你爲什麼接受我的回答?它的形狀仍然錯誤。我很感激,但我認爲你應該等待更好的答案。 –

回答

21

你可以使用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數學,大概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

+0

是否有「VertexLabelingFunction」? – Ning

+0

@寧在我的答案中有一個錯誤;我的意思是'VertexRenderingFunction'。我不相信有一個頂點**標籤* Funcion。另外,我注意到我的圖形相對於您的原始示例中的圓圈大小存在缺陷。我糾正這是我剛剛提出的第二個版本。 –

5

沒有必要進行互動放置在所需位置,讓您的頂點作爲mr.Wizard建議在his answer。您可以使用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

+0

我並不是說有必要有交互式佈局,但我可以看到如何推斷。這種方法也適用。除了我使用的黑客的變體之外,您是否知道保留可編輯性的任何方法? –

+0

@ Mr.Wizard我看不出一個簡單的出路。 –