Это относительно простая проблема. Ключ в том, что если вы можете параметризовать его, вы можете построить его. Согласно документации ListContourPlot и ListDensityPlot принимают данные в двух формах: массив значений высоты или список координат плюс значение функции ({{x, y, f} ..}
). Со второй формой легче работать, так что даже если ваши данные находятся в первой форме, мы преобразуем их во вторую форму.
Просто, чтобы преобразовать данные формы {{r, t, f} ..}
в данные формы {{x, y, f} ..}
, вы делаете N[{#[[1]] Cos[ #[[2]] ], #[[1]] Sin[ #[[2]] ], #[[3]]}]& /@ data
, при применении к данным, взятым из BesselJ[1, r/2] Cos[3 t]
, вы получаете

А как насчет того, когда у вас просто есть массив данных, например этот парень ? В этом случае у вас есть 2D-массив, в котором каждая точка в массиве имеет известное местоположение, и для того, чтобы построить его, вы должны превратить его во вторую форму. Я неравнодушен к MapIndexed
, но есть и другие способы сделать это. Допустим, ваши данные хранятся в массиве, где строки соответствуют радиальной координате, а столбцы - угловой координате. Затем, чтобы преобразовать его, я бы использовал
R = 0.01; (*radial increment*)
T = 0.05 Pi; (*angular increment*)
xformed = MapIndexed[
With[{r = #2[[1]]*R, t = #2[[1]]*t, f = #1},
{r Cos[t], r Sin[t], f}]&, data, {2}]//Flatten[#,1]&
, который дает тот же результат.
Если у вас есть аналитическое решение, вам нужно преобразовать его в декартовы координаты, как описано выше, но вместо этого вы используете правила замены. Например,
ContourPlot[ Evaluate[
BesselJ[1, r/2]*Cos[3 t ] /. {r -> Sqrt[x^2 + y^2], t -> ArcTan[x, y]}],
{x, -5, 5}, {y, -5, 5}, PlotPoints -> 50,
ColorFunction -> ColorData["DarkRainbow"], Contours -> 25]
дает

Следует отметить две вещи: 1) Evaluate
необходим для обеспечения правильного выполнения замены, и 2) ArcTan[x, y]
учитывает квадрант, в котором находится точка {x,y}
.