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}
]
Сюжет почти такой же, но он более интерактивный (всплывающие подсказки и т. Д.).