【问题标题】:Arctan Binning, from Plot to Histogram, the tricksArctan Binning,从绘图到直方图,技巧
【发布时间】:2023-03-09 02:15:01
【问题描述】:

基于 Sjoerd,From Cartesian Plot to Polar Histogram using Mathematica 上的出色解决方案和扩展,请考虑以下内容:

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

如您所见,直方图显示了应有的旋转对称性。 我想尽一切办法把这些弄明白,但没有成功。没有反向是最糟糕的。我试过 RotateRight 没有成功。我觉得问题出在我的 BinCount 上。 ArcTan 输出从 -Pi 到 Pi,而 Sjoerd 建议我需要从 0 到 2Pi。但我不明白该怎么做。

编辑:问题已解决。感谢 Sjoerd、Belisarius、Heike 解决方案,我能够在给定图像重心的情况下显示眼睛注视位置的直方图。

【问题讨论】:

  • @beliarius:当以ArcTan[x,y] 形式使用ArcTan 时,范围为(-Pi,Pi]
  • @belisarius,对不起,我现在很忙 :-(。谢谢你的帮助!
  • @500 注意Heike的解决方案,因为它似乎更好地匹配位置
  • 我在您最初提出的这个问题上提供了答案。
  • @Sjoerd 也许我错了,但在我看来,您的极坐标直方图并不代表点密度。也许缺少对称变换。 (请参阅那里的答案中的 90 - 135 度范围)

标签: wolfram-mathematica bin


【解决方案1】:

现在只是检查,但你的第一个情节似乎有缺陷:

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

编辑

我没有遵循你的所有代码,但屏幕中心的反映似乎解决了这个问题:

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

编辑

在这里您可能会看到我的代码中的小错位,这在 Heike 的回答中得到了解决(投赞成票!)

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

【讨论】:

    【解决方案2】:

    您可以使用ChartElementFunction 选项准确定位扇区。 ChartElementFunction 的第一个参数是 {{angleMin, angleMax}, {rMin,rMax}} 的形式。第一个扇区有边界{angleMin, angleMax} = {-Pi/12, Pi/12},第二个有边界{Pi/12, 3 Pi/12},等等。因此,要获得正确的旋转,您可以执行类似的操作

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

    【讨论】:

    • 当我认为我很好的那一刻我回来看看你的解决方案和belisarius cmets,谢谢你我什至没有注意酒吧的位置这太整洁了。
    猜你喜欢
    • 2018-05-26
    • 2015-05-07
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    相关资源
    最近更新 更多