Criação do equivalente de mapa de calor polar do Python (efetivamente ListDensityPolarPlot)
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
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.)