2011-09-17 12 views
7

Basado en Sjoerd, gran solución y la extensión de From Cartesian Plot to Polar Histogram using Mathematica, por favor considere lo siguiente:Arctan Agrupación, desde Plot para histograma, los trucos

list = {{21, 16}, {16, 14}, {11, 11}, {11, 12}, 
     {13, 15}, {18, 17}, {19, 11}, {17, 16}, {16, 19}} 

ScreenCenter = {20, 15} 

ListPolarPlot[{ArcTan[##], EuclideanDistance[##]} & @@@ (# - ScreenCenter & /@ list), 
       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

Module[{Countz, maxScale, angleDivisions, dAng}, 
     Countz = Reverse[BinCounts[[email protected][ArcTan[#[[1]] - ScreenCenter[[1]], #[[2]] - 
       ScreenCenter[[2]]] &, list, {1}], {-\[Pi], \[Pi], \[Pi]/6}]]; 
     maxScale = 4; 
     angleDivisions = 12; 
     dAng = (2 \[Pi])/angleDivisions; 

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

enter image description here

Como puede ver, el histograma muestra una simetría rotacional de lo que debería. Intenté todo para aclarar las cosas pero no tuve éxito. Sin inversión es peor. Intenté con RotateRight sin éxito. Siento que el problema está en mi BinCount. Salida de ArcTan de -Pi a Pi, mientras que Sjoerd sugirió que necesitaba pasar de 0 a 2Pi. Pero no entiendo cómo hacerlo.

EDITAR: Problema resuelto. Gracias a las soluciones Heike de Sjoerd, Belisarius, puedo mostrar un histograma de las ubicaciones de las fijaciones de los ojos dadas el centro de gravedad de una imagen.

enter image description here

+0

@beliarius: Al usar 'ArcTan' en la forma' ArcTan [x, y] 'el rango es' (-Pi, Pi) ' – Heike

+0

@belisarius, lo siento, estoy tan fuera de lugar ahora :-(¡Gracias por su ayuda! – 500

+0

@ 500 Preste atención a la solución de Heike como parece coincidir mejor con las posiciones –

Respuesta

5

Se puede usar la opción ChartElementFunction para posicionar con precisión los sectores. El primer argumento de ChartElementFunction es de la forma {{angleMin, angleMax}, {rMin,rMax}}. El primer sector tiene límites {angleMin, angleMax} = {-Pi/12, Pi/12}, el segundo {Pi/12, 3 Pi/12}, etc. Por lo tanto, para obtener la rotación a la derecha se podía hacer algo como

Module[{Countz, maxScale, angleDivisions, dAng}, 
maxScale = 4; 
angleDivisions = 12; 
dAng = (2 \[Pi])/angleDivisions; 
Countz = BinCounts[ 
    [email protected][ArcTan @@ (# - ScreenCenter) &, list, {1}], 
    {-Pi, Pi, dAng}]; 

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

    ChartElementFunction -> 
    Function[{range}, Disk[{0, 0}, range[[2, 2]], - 11 Pi/12 + range[[1]]]]]] 

enter image description here

+0

en el momento en que pensé que era bueno, volví y vi su solución y los comentarios de belisarius, gracias, ni siquiera presté atención a la ubicación del bar, esto es muy ordenado. – 500

6

Apenas llegando en este momento, pero su primera trama parece viciado:

list = {{21, 16}, {16, 14}, {11, 11}, {11, 12}, {13, 15}, 
     {18, 17}, {19, 11}, {17, 16}, {16, 19}}; 
ScreenCenter = {20, 15}; 

Show[ListPlot[list, PlotStyle -> Directive[PointSize[Medium], Purple]], 
    Graphics[ 
       {Red, PointSize[Large], Point[ScreenCenter], 
       Circle[ScreenCenter, 10]}], 
AspectRatio -> 1, Axes -> False] 

enter image description here

ListPolarPlot[{ArcTan[Sequence @@ ##], Norm[##]} &/@ (#-ScreenCenter & /@ list), 
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

Editar

que no siguieron todo el código, sino un reflejo en el centro de la pantalla parece arreglar la cosa:

Module[{Countz, maxScale, angleDivisions, dAng}, 
Countz = BinCounts[ 
       {ArcTan[Sequence @@ ##]} & /@ (# + ScreenCenter & /@ -list), 
      {-Pi, Pi, Pi/6}]; 
maxScale = 4; 
angleDivisions = 12; 
dAng = (2 Pi)/angleDivisions; 

SectorChart[{ConstantArray[1, Length[Countz]], Countz}\[Transpose], 

    SectorOrigin -> {-Pi/angleDivisions, "Counterclockwise"}, 
    PolarAxes -> True, 
    PolarGridLines -> Automatic, 
    PolarTicks -> {Table[{i \[Degree] + Pi/angleDivisions, 
         i \[Degree]}, {i, 0, 345, 30}], Automatic}, 
    ChartStyle -> {Directive[EdgeForm[{Black, Thickness[0.005]}], Red]}, 
    BaseStyle -> {FontFamily -> "Arial", FontWeight -> Bold, 
    FontSize -> 12}, 
    ImageSize -> 400]] 

enter image description here

Editar

Aquí puede ver el pequeña desalineación en mi código, que se resuelve en la respuesta de Heike (¡vota por ella!)

Show[Module[{Countz, maxScale, angleDivisions, dAng}, 
    Countz = BinCounts[{ArcTan[ 
     Sequence @@ ##]} & /@ (# + 
     ScreenCenter & /@ -list), {-\[Pi], \[Pi], \[Pi]/6}]; 
    maxScale = 4; 
    angleDivisions = 12; 
    dAng = (2 \[Pi])/angleDivisions; 
    SectorChart[{ConstantArray[1, Length[Countz]], Countz}\[Transpose], 
    SectorOrigin -> {-\[Pi]/angleDivisions, "Counterclockwise"}, 
    PolarAxes -> True, PolarGridLines -> Automatic, 
    PolarTicks -> {Table[{i \[Degree] + \[Pi]/angleDivisions, 
     i \[Degree]}, {i, 0, 345, 30}], Automatic}, 
    ChartStyle -> {Directive[EdgeForm[{Black, Thickness[0.005]}], 
     Red]}, BaseStyle -> {FontFamily -> "Arial", FontWeight -> Bold, 
    FontSize -> 12}, ImageSize -> 400]], 
ListPlot[Plus[# - ScreenCenter] & /@ list/2.5, 
    PlotMarkers -> Image[CrossMatrix[10], ImageSize -> 10]] 
] 

enter image description here