Criação do equivalente de mapa de calor polar do Python (efetivamente ListDensityPolarPlot)

Sep 29 2020

Eu tenho um conjunto de dados que está no formulário

{{\[Theta], \[Phi], r},....}

Ou para simplificar:

data={{0, 0, 3.3102}, {0, 2, 3.3102}, ..., {10, 90, 4.084}}

Como alternativa, um conjunto de dados pode ser gerado usando:

data=Flatten[Table[{th,phi,RandomReal[100]},{th,0,45,2},{phi,0,90,2}],1];

Agora quero plotar esses dados em um gráfico polar para obter algo equivalente a:

Onde o texto na imagem se refere a diferentes planos de cristal não é importante. Para gerar um gráfico de densidade uniforme, deve haver alguma interpolação entre os pontos de dados, mas acho que não é necessário, pois sempre posso fazer isso no pré-processamento dos pontos de dados. Agora, isso é gerado com certa facilidade usando python, no entanto, estou procurando uma maneira de gerar tal plotagem na matemática na tentativa de manter a consistência do layout entre meus outros plots.

Posso gerar facilmente um ListDensityPlot usando:

ListDensityPlot[data]

Isso parece (com algumas opções de manipulação de legendas e gráficos ajustados para torná-lo "mais apresentável"):

Consegui converter o gráfico retangular em circular usando transfromação de coordenadas, ou seja,

N[{#[[1]] Cos[#[[2]]], #[[1]] Sin[#[[2]]], #[[3]]}] & /@data

Não tenho 100% de certeza de que isso seja correto para ser honesto, mas acho que é a abordagem certa, ou seja, converter coordenadas

Mas eu ainda não sei como adicionar as linhas de grade corretamente, a legenda personalizada, ou seja, ângulo azimutal, acho que sempre posso adicionar depois à mão, mas gostaria de adicioná-la durante a plotagem também

Respostas

3 xzczd Sep 30 2020 at 16:52

Aqui está o meu teste:

SeedRandom[2020]; 
data = Flatten[Table[{th, phi, RandomReal[100]}, {th, 0, 45, 3}, 
                                                 {phi, 0, 90 Degree, 2 Degree}], 1];

func = Interpolation[data];
{{rmin, rmax}, {phimin, phimax}} = func["Domain"];
radian = 32; dphi = 15 Degree;
Legended[ParametricPlot[r {Cos[phi], Sin[phi]}, {r, rmin, rmax}, {phi, phimin, phimax}, 
   ColorFunction -> 
    Function[{x, y, r, phi}, 
     ColorData["Rainbow"]@Rescale[func[r, phi], MinMax@data[[All, 3]]]], 
   ColorFunctionScaling -> False, PlotPoints -> 50, 
   Frame -> {{True, False}, {True, False}}, PlotRangePadding -> {{1, 10}, {1, 10}}, 
   PlotRange -> {{0, rmax}, {0, rmax}}]~Show~
  PolarPlot[radian, {phi, phimin, phimax}, PolarAxes -> Automatic, 
   PolarTicks -> {"Degrees", None}, 
   PolarGridLines -> {Range[phimin, phimax, dphi], Automatic}, GridLinesStyle -> Black,
   PlotRange -> All, PlotStyle -> Transparent], 
 BarLegend[{ColorData["Rainbow"]@Rescale[#, MinMax@data[[All, 3]]] &, 
   MinMax@data[[All, 3]]}]]

O principal obstáculo que me impede de criar uma função de uso geral é que não está claro como PolarPlotdecide a posição de PolarAxes. (Acabei encontrando o radian = 32;por tentativa e erro.)