2011-09-14 21 views
8

hãy xem xét:Từ Lô Descartes to Polar Histogram sử dụng Mathematica

dalist={{21, 22}, {26, 13}, {32, 17}, {31, 11}, {30, 9}, 
     {25, 12}, {12, 16}, {18, 20}, {13, 23}, {19, 21}, 
     {14, 16}, {14, 22}, {18,22}, {10, 22}, {17, 23}} 


ScreenCenter = {20, 15} 

FrameXYs = {{4.32, 3.23}, {35.68, 26.75}} 

Graphics[{EdgeForm[Thick], White, Rectangle @@ FrameXYs, 
      Black, [email protected], Red, Disk[ScreenCenter, .5]}] 

enter image description here

Những gì tôi muốn làm là để tính toán, đối với mỗi điểm, góc của nó trong một hệ tọa độ như:

enter image description here

Trên đây là đầu ra Deisred, đó là số đếm tần số cho một "Góc Bin" cụ thể. Khi tôi biết cách tính góc, tôi có thể thực hiện điều đó.

Trả lời

12

Mathematica có chức năng cốt truyện đặc biệt cho mục đích này: ListPolarPlot.Bạn cần phải chuyển đổi x của bạn, y cặp theta, cặp r, ví dụ như sau:

ListPolarPlot[{ArcTan[##], EuclideanDistance[##]} & @@@ (#-ScreenCenter & /@ dalist), 
      PolarAxes -> True, 
      PolarGridLines -> Automatic, 
      Joined -> False, 
      PolarTicks -> {"Degrees", Automatic}, 
      BaseStyle -> {FontFamily -> "Arial", FontWeight -> Bold,FontSize -> 12}, 
      PlotStyle -> {Red, PointSize -> 0.02} 
] 

enter image description here


CẬP NHẬT

Theo yêu cầu mỗi bình luận, biểu đồ cực có thể được thực hiện như sau:

maxScale = 100; 
angleDivisions = 20; 
dAng = (2 \[Pi])/angleDivisions; 

S ome dữ liệu thử nghiệm:

(counts = Table[RandomInteger[{0, 100}], {ang, angleDivisions}]) // BarChart 

enter image description here

ListPolarPlot[{{0, maxScale}}, 
    PolarAxes -> True, PolarGridLines -> Automatic, 
    PolarTicks -> {"Degrees", Automatic}, 
    BaseStyle -> {FontFamily -> "Arial", FontWeight -> Bold, FontSize -> 12}, 
    PlotStyle -> {None}, 
    Epilog -> {Opacity[0.7], Blue, 
       Table[ 
       [email protected] 
        { 
        {0, 0}, 
        counts[[ang + 1]] {Cos[ang dAng - dAng/2],Sin[ang dAng- dAng/2]}, 
        counts[[ang + 1]] {Cos[ang dAng + dAng/2],Sin[ang dAng+ dAng/2]} 
        }, 
       {ang, 0, angleDivisions - 1} 
       ]} 
] 

enter image description here

Một cải tiến nhỏ về hình ảnh sử dụng Disk ngành thay vì Polygon s:

ListPolarPlot[{{0, maxScale}}, 
    PolarAxes -> True, PolarGridLines -> Automatic, 
    PolarTicks -> {"Degrees", Automatic}, 
    BaseStyle -> {FontFamily -> "Arial", FontWeight -> Bold, 
    FontSize -> 12}, PlotStyle -> {None}, 
    Epilog -> {Opacity[0.7], Blue, 
       Table[ 
       Disk[{0,0},counts[[ang+1]],{ang dAng-dAng/2,ang dAng+dAng/2}],  
       {ang, 0, angleDivisions - 1} 
       ] 
       } 
] 

enter image description here

Có thể tách rõ hơn các 'thanh' bằng cách thêm EdgeForm[{Black, Thickness[0.005]}] vào Epilog. Bây giờ các con số đánh dấu các vòng vẫn có dấu thập phân không cần thiết theo sau chúng. Theo cốt truyện với sự thay thế /. Style[num_?MachineNumberQ, List[]] -> Style[num // Round, List[]] loại bỏ những người. Kết quả cuối cùng là:

enter image description here

Cốt truyện trên cũng có thể được tạo ra với SectorChart mặc dù cốt truyện này chủ yếu được dùng để hiển thị chiều rộng khác nhau và chiều cao của dữ liệu, và không phải là tinh chỉnh cho lô nơi bạn có các lĩnh vực có chiều rộng cố định và bạn muốn làm nổi bật chỉ đường và số liệu theo các hướng đó. Nhưng nó có thể được thực hiện bằng cách sử dụng SectorOrigin. Vấn đề là tôi lấy nó rằng điểm giữa của mã ngành theo hướng của nó để có 0 deg ở giữa một khu vực tôi phải bù đắp nguồn gốc bằng \[Pi]/angleDivisions và chỉ định ve bằng tay khi chúng được xoay quá:

SectorChart[ 
    {ConstantArray[1, Length[counts]], counts}\[Transpose], 
    SectorOrigin -> {-\[Pi]/angleDivisions, "Counterclockwise"}, 
    PolarAxes -> True, PolarGridLines -> Automatic, 
    PolarTicks -> 
    { 
    Table[{i \[Degree] + \[Pi]/angleDivisions, i \[Degree]}, {i, 0, 345, 15}], 
    Automatic 
    }, 
    ChartStyle -> {Directive[EdgeForm[{Black, Thickness[0.005]}], Blue]}, 
    BaseStyle -> {FontFamily -> "Arial", FontWeight -> Bold, 
    FontSize -> 12} 
] 

enter image description here

Cốt truyện là gần như giống nhau, nhưng nó là tương tác nhiều hơn (chú giải công cụ và như vậy).

+0

Cảm ơn Bạn Sjoerd, có biểu đồ cực như vậy không? – 500

+0

@ 500 xem cập nhật –

+0

http: //t0.gstatic.com/images? q = tbn: ANd9GcTQrKELoYtiEuAElJwl6ocF60URjADZNW1KrFQ8q4npE3mxtMWP –

5

Điều đó có vẻ là polar coordinate system. Các công thức chuyển đổi Descartes-to-cực là in that same article:

enter image description here

này trả về góc theo radian.

+5

Để thêm vào câu trả lời của Blender, hãy sử dụng hai kiểu tham số của ['ArcTan'] (http://reference.wolfram.com/mathematica/ref/ArcTan.html) vì nó tự động chiếm phần tư. – rcollyer

+0

Cảm ơn bạn, Cách tốt nhất để đặt ScreenCenter = {20, 15} làm nguồn gốc của tôi cho chuyển đổi là gì? – 500

+1

Thay thế tất cả 'y' bằng 'y + ScreenCenter.y' và làm tương tự cho' x'. – Blender

5

này

[email protected][#[[1]], #[[2]]] & /@ (# - ScreenCenter & /@ dalist) 

trả về danh sách các góc của tia từ ScreenCenter để mỗi điểm, trong radian và giữa -pi và pi.

Tức là, tôi cho rằng bạn muốn góc giữa mỗi điểm trong ô của bạn và chấm đỏ.

Lưu ý việc sử dụng ArcTan[x,y] thay vì ArcTan[y/x], tự động chọn dấu thích hợp (nếu không bạn phải thực hiện bằng tay, như trong câu trả lời của @ Blender).

+0

Hey điều này thực sự rõ ràng cảm ơn bạn! – 500

+0

Tôi xin lỗi tôi sẽ phát điên. Khi tôi cố gắng để thực hiện với bạn giải pháp hoặc Sjoerd và không thể vẽ biểu đồ hi với một trong hai trên dữ liệu thực tế của tôi góc phần tư là trực quan sai. Tôi rất bối rối, bạn có thể chỉ cho tôi một ví dụ không? Đối với tôi Phía trên bên trái nếu xuống bên phải, Phía trên bên phải, xuống bên trái. – 500

+0

@ 500 Tôi không hiểu bạn đang hỏi gì! "Triển khai" ở đây là gì? Bạn có hiểu rằng đây là các góc, theo radian, từ -pi đến pi và được đo từ trục x không? – acl

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