Wolfram mathematica 使用Mathematica从笛卡尔图到极坐标直方图

Wolfram mathematica 使用Mathematica从笛卡尔图到极坐标直方图,wolfram-mathematica,angle,Wolfram Mathematica,Angle,请考虑: 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}} G

请考虑:

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, Point@dalist, Red, Disk[ScreenCenter, .5]}]

我想做的是计算每个点在坐标系中的角度,例如:

上面是Deisred输出,这些是给定特定“角度箱”的点的频率计数。 一旦我知道如何计算角度,我应该能够做到这一点。

这似乎是最重要的。笛卡尔坐标到极坐标的转换公式为:

这将返回以弧度为单位的角度。

N@ArcTan[#[[1]], #[[2]]] & /@ (# - ScreenCenter & /@ dalist)
返回光线从
ScreenCenter
到每个点的角度列表,以弧度为单位,介于-pi和pi之间

也就是说,我假设你想要的是图中每个点和红点之间的角度


请注意使用的是
ArcTan[x,y]
而不是
ArcTan[y/x]
,它会自动选择合适的符号(否则您必须手动完成,如@Blender的答案)。

Mathematica为此有一个特殊的绘图功能:
ListPolarPlot
。您需要将x,y对转换为θ,r对,例如:

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}
]
maxScale = 100;
angleDivisions = 20;
dAng = (2 \[Pi])/angleDivisions;


更新

根据注释要求,极性直方图可按如下方式制作:

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}
]
maxScale = 100;
angleDivisions = 20;
dAng = (2 \[Pi])/angleDivisions;
一些测试数据:

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

使用
磁盘
扇区而不是
多边形
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}
               ]
              }
]

通过在
Epilog
中添加
EdgeForm[{Black,Thickness[0.005]}]
,可以更清晰地分离“条”。现在标记环的数字后面仍然有不必要的小数点。使用替换的
/跟随绘图。Style[num_?MachineNumberQ,List[]->Style[num//Round,List[]]
删除这些。最终结果是:

也可以使用
SectorChart
生成上述绘图,尽管此绘图主要用于显示不同宽度和高度的数据,并且对于具有固定宽度扇区且希望突出显示这些方向上的方向和数据计数的绘图而言,不会进行微调。但是可以使用
SectorOrigin
来完成。问题是,我认为扇区的中点对其方向进行编码,因此要使扇区的中点为0度,我必须通过
\[Pi]/angleDivisions
偏移原点,并在刻度旋转时手动指定刻度:

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


绘图几乎相同,但更具互动性(工具提示等)。

要添加到Blender的答案中,请使用的双参数形式,因为它会自动计算象限。谢谢,设置ScreenCenter={20,15}的最佳方式是什么作为转换的起点?将所有的
y
s替换为
y+ScreenCenter.y
,并对
x
执行类似操作。谢谢Sjoerd,有极坐标直方图吗?@belisarius Close,但没有雪茄;-)@西蒙:是的!我前段时间看过。我从来都不明白画蝙蝠函数需要250张选票:)@Simon但是有很多投票率很高的答案我很抱歉我快疯了。当我尝试使用you solution或Sjoerd实现时,无法在实际数据上绘制hi柱状图,象限在视觉上是错误的。我很困惑,你能给我举个例子吗?对我来说,左上角是右下角,右上角,左下角。@500我不明白你在问什么!这里的“实施”是什么?你知道这些都是角度,以弧度表示,从-pi到pi,从x轴开始测量吗?