20

Mathematicaがこのようなものを描くことは可能で実用的ですか(Graphvizによって作成されています):

ここに画像の説明を入力してください

これは私が得ることができる最高のものです(しかし、形とスタイルは満足のいくものではありません):

ここに画像の説明を入力してください

コード:

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

2 に答える 2

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, #]} &)]

ここに画像の説明を入力してください


メソッドは2015年2月に更新されました

描画ツール(ダブルクリック)を使用してグラフをインタラクティブに再配置する機能を維持するにはGraphicsComplex、座標ではなくインデックスを使用して、頂点グラフィックを内部に保持する必要があります。インクリメント変数を使用することでこれを行うことができると思いVertexRenderingFunctionますが、後処理を使用する方がおそらくより堅牢であるように思われます。これはMathematicaのバージョン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]}

ここに画像の説明を入力してください

于 2011-11-13T03:46:02.210 に答える
5

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}}
]

ここに画像の説明を入力してください

于 2011-11-13T19:48:02.807 に答える