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}]
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]]
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.
Just checking right now, but your first plot seems flawed:
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]
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}]
Edit
I did not followed all your code, but a reflection on the Screen Center seems to fix the thing:
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]]
Edit
Here you may see the small misalignment in my code, that is solved in Heike's answer (vote for it!)
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]]
]
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]]]]]]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With