2011-08-03 35 views
6

Cho một tập các điểm trong mặt phẳng T={a1,a2,...,an} thì Graphics[Polygon[T]] sẽ vẽ đồ thị đa giác được tạo bởi các điểm. Làm cách nào để thêm nhãn vào các đỉnh của đa giác? Chỉ đơn thuần là chỉ mục như một nhãn sẽ tốt hơn thì không có gì. Bất kỳ ý tưởng?Ghi nhãn các đỉnh của đa giác trong Mathematica

Trả lời

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

Để thêm điểm cũng

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

update:

Sử dụng chỉ số:

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

Đây là thật sự tốt đẹp. Hầu như những gì tôi theo sau. Làm thế nào có thể thay đổi ví dụ của bạn, và có được chỉ số của đỉnh như là một nhãn chứ không phải là các tọa độ? Cảm ơn trước! – Dror

+0

được thêm vào để cập nhật .... – Nasser

+0

WOW! Điều đó thực sự tuyệt vời! Bạn có thể thêm một số giải thích sự kỳ diệu là gì? – Dror

7

Nasser's version (update) sử dụng pattern matching. Điều này sử dụng functional programming. MapIndexed cung cấp cho bạn cả tọa độ và chỉ mục của chúng mà không cần Position để tìm thấy nó.

pts = {{1, 0}, {0, Sqrt[3]}, {-1, 0}}; 
Graphics[ 
{ 
    {LightGray, Polygon[pts]}, 
    MapIndexed[Text[Style[#2[[1]], Red], #1, {0, -1}] &, pts] 
    } 
] 

enter image description here

hoặc, nếu bạn không thích MapIndexed, đây là một phiên bản với Apply (ở cấp 1, ký hiệu ghi vào @@@).

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

này có thể được mở rộng để nhãn tùy ý như sau:

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

Bạn có thể tận dụng các tùy chọn của GraphPlot cho việc này. Ví dụ:

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

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

Bằng cách này bạn cũng có thể tận dụng VertexLabeling -> Tooltip, hoặc VertexRenderingFunction nếu bạn muốn. Nếu bạn không muốn các cạnh được phủ lên, bạn có thể thêm EdgeRenderingFunction -> None vào chức năng GraphPlot. Ví dụ:

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

Các vấn đề liên quan