是否有可能和實際的數學來繪製這樣的事情(由Graphviz的創建):如何使用Mathematica繪製經典狀態圖?
這是我能得到最好的(但在造型和風格都不能令人滿意):
代碼:
GraphPlot[{{A -> C, "go"}, {C -> B, "gone"}, {C -> D,
"went"}, {C -> C, "loop"}}, VertexLabeling -> True,
DirectedEdges -> True]
是否有可能和實際的數學來繪製這樣的事情(由Graphviz的創建):如何使用Mathematica繪製經典狀態圖?
這是我能得到最好的(但在造型和風格都不能令人滿意):
代碼:
GraphPlot[{{A -> C, "go"}, {C -> B, "gone"}, {C -> D,
"went"}, {C -> C, "loop"}}, VertexLabeling -> True,
DirectedEdges -> True]
你可以使用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, #]} &)]
方法更新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]}
是否有「VertexLabelingFunction」? – Ning
@寧在我的答案中有一個錯誤;我的意思是'VertexRenderingFunction'。我不相信有一個頂點**標籤* Funcion。另外,我注意到我的圖形相對於您的原始示例中的圓圈大小存在缺陷。我糾正這是我剛剛提出的第二個版本。 –
沒有必要進行互動放置在所需位置,讓您的頂點作爲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}}
]
我並不是說有必要有交互式佈局,但我可以看到如何推斷。這種方法也適用。除了我使用的黑客的變體之外,您是否知道保留可編輯性的任何方法? –
@ Mr.Wizard我看不出一個簡單的出路。 –
沒有理由不能使用基本圖形繪製這樣的事情。您是否要求自動佈局解決方案? –
@ Mr.Wizard是的,我正在尋找一些更高級的基元來繪製複雜的狀態圖。我不知道Mathematica是否提供這個功能。我通過文檔搜索並檢查了「GraphPlot」函數的選項,並以上面的代碼結束。 – Ning
你爲什麼接受我的回答?它的形狀仍然錯誤。我很感激,但我認爲你應該等待更好的答案。 –