请考虑:
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输出,它们是给定特定“角度仓”的点的频率计数。 一旦我知道如何计算角度,我应该能够做到这一点。
答案 0 :(得分:12)
Mathematica为此目的有一个特殊的情节功能:ListPolarPlot
。您需要将x,y对转换为theta,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;
一些测试数据:
(counts = Table[RandomInteger[{0, 100}], {ang, angleDivisions}]) // BarChart
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[
Polygon@
{
{0, 0},
counts[[ang + 1]] {Cos[ang dAng - dAng/2],Sin[ang dAng- dAng/2]},
counts[[ang + 1]] {Cos[ang dAng + dAng/2],Sin[ang dAng+ dAng/2]}
},
{ang, 0, angleDivisions - 1}
]}
]
使用Disk
部门代替Polygon
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}
]
}
]
通过在EdgeForm[{Black, Thickness[0.005]}]
中添加Epilog
,可以更清晰地分离“条形图”。现在标记环的数字仍然有不必要的小数点跟踪它们。在替换/. 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}
]
情节几乎相同,但它更具互动性(工具提示等)。
答案 1 :(得分:5)
答案 2 :(得分:5)
此
N@ArcTan[#[[1]], #[[2]]] & /@ (# - ScreenCenter & /@ dalist)
返回从ScreenCenter
到每个点的光线角度列表,以弧度表示,在-pi和pi之间。
也就是说,我假设您想要绘图中每个点与红点之间的角度。
请注意使用ArcTan[x,y]
而不是ArcTan[y/x]
,它会自动选择相应的符号(否则您必须手动执行,如@Blender的回答)。