2011-08-03 13 views
6

平面に点の集合が与えられた場合、Graphics[Polygon[T]]は点によって生成されたポリゴンをプロットします。T={a1,a2,...,an}ポリゴンの頂点にラベルを追加するにはどうすればよいですか?ラベルとしてのインデックスだけが良いとは言えません。何か案は?Mathematicaのポリゴンの頂点にラベルを付ける

答えて

9
pts = {{1, 0}, {0, Sqrt[3]}, {-1, 0}}; 
Graphics[ 
{{LightGray, Polygon[pts]}, 
    {pts /. {x_, y_} :> Text[Style[{x, y}, Red], {x, y}]}} 
] 

enter image description here

pts = {{1, 0}, {0, Sqrt[3]}, {-1, 0}}; 
Graphics[ 
{{LightGray, Polygon[pts]}, 
    {pts /. {x_, y_} :> Text[Style[{x, y}, Red], {x, y}, {0, -1}]}, 
    {pts /. {x_, y_} :> {Blue, PointSize[0.02], Point[{x, y}]}} 
    } 
] 

enter image description here

をポイントを追加するには、更新:

がインデックスを使用します。

pts = {{1, 0}, {0, Sqrt[3]}, {-1, 0}}; 
Graphics[ 
{{LightGray, Polygon[pts]}, 
    {pts /. {x_, y_} :> 
    Text[Style[Position[pts, {x, y}], Red], {x, y}, {0, -1}]} 
    } 
] 

enter image description here

+0

これは本当に素晴らしいです。ほとんど私が後にしている。どのようにあなたの例を変更し、座標ではなくラベルとして頂点のインデックスを得ることができますか?前もって感謝します! – Dror

+0

が更新されました.... – Nasser

+0

WOW!それは本当に素晴らしいです!あなたは何か魔法の説明を追加できますか? – Dror

7

Nasser's version (update)pattern matchingを使用しています。これはfunctional programmingを使用します。 MapIndexedは、Positionを見つける必要なしに、座標とそのインデックスの両方を提供します。

enter image description here

pts = {{1, 0}, {0, Sqrt[3]}, {-1, 0}}; 
Graphics[ 
{ 
    {LightGray, Polygon[pts]}, 
    MapIndexed[Text[Style[#2[[1]], Red], #1, {0, -1}] &, pts] 
    } 
] 
か、あなたが MapIndexedを好きではない場合は、ここでは(レベル1、中置記法 @@@で) Applyとバージョンです。

pts = {{1, 0}, {0, Sqrt[3]}, {-1, 0}}; 
idx = Range[Length[pts]]; 
Graphics[ 
{ 
    {LightGray, Polygon[pts]}, 
    Text[Style[#2, Red], #1, {0, -1}] & @@@ ({pts, idx}\[Transpose]) 
    } 
] 

これは、次のように任意のラベルに拡張することができます。

pts = {{1, 0}, {0, Sqrt[3]}, {-1, 0}}; 
idx = {"One", "Two", "Three"}; 
Graphics[ 
{ 
    {LightGray, Polygon[pts]}, 
    Text[Style[#2, Red], #1, {0, -1}] & @@@ ({pts, idx}\[Transpose]) 
    } 
] 

enter image description here

0

あなたはこのためGraphPlotのオプションを活用することができます。例:

c = RandomReal[1, {3, 2}] 
g = GraphPlot[c, VertexLabeling -> True, VertexCoordinateRules -> c]; 

Graphics[{[email protected], g[[1]]}] 

あなたも、あなたがしたい場合はVertexLabeling -> Tooltip、またはVertexRenderingFunctionを利用することができますこの方法。エッジをオーバーレイしたくない場合は、GraphPlot機能にEdgeRenderingFunction -> Noneを追加することができます。例:

c = RandomReal[1, {3, 2}] 
g = GraphPlot[c, VertexLabeling -> All, VertexCoordinateRules -> c, 
    EdgeRenderingFunction -> None, 
    VertexRenderingFunction -> ({White, EdgeForm[Black], Disk[#, .02], 
     Black, Text[#2, #1]} &)]; 

Graphics[{Brown, [email protected], g[[1]]}] 

enter image description here

関連する問題