Search code examples
wolfram-mathematicabin

Arctan Binning, from Plot to Histogram, the tricks


Based on Sjoerd, great solution and extension on From Cartesian Plot to Polar Histogram using Mathematica, please consider the Following :

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[Flatten@Map[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

As you can see the histogram shows a rotational symmetry of what it should. I tried everything to get those straight but did not succeed. Without Reverse it is worst. I tried RotateRight without success.I feel the problem is in my BinCount. ArcTan output from -Pi to Pi whereas Sjoerd suggested I needed to go from 0 to 2Pi. But I don`t understand how to do so.

EDIT : Problem solved. Thanks to Sjoerd, Belisarius, Heike solutions, I am able to show a histogram of the eye fixations locations given the center of gravity of an image.

enter image description here


Solution

  • You could use the ChartElementFunction option to position the sectors accurately. The first argument of ChartElementFunction is of the form {{angleMin, angleMax}, {rMin,rMax}}. The first sector has bounds {angleMin, angleMax} = {-Pi/12, Pi/12}, the second one {Pi/12, 3 Pi/12}, etc. Therefore, to get the right rotation you could do something like

    Module[{Countz, maxScale, angleDivisions, dAng},
     maxScale = 4;
     angleDivisions = 12;
     dAng = (2 \[Pi])/angleDivisions;
     Countz = BinCounts[
       Flatten@Map[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