Creación del equivalente del mapa de calor polar de Python (efectivamente ListDensityPolarPlot)

Sep 29 2020

Tengo un conjunto de datos que tiene el formato

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

O para hacerlo más simple:

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

Alternativamente, se puede generar un conjunto de datos usando:

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

Ahora quiero trazar estos datos en una gráfica polar para obtener algo equivalente a:

Donde el texto en la imagen que se refiere a diferentes planos de cristal no es importante. Para generar una gráfica de densidad uniforme, debería haber alguna interpolación entre los puntos de datos, pero supongo que no es necesario ya que siempre puedo hacer eso en el preprocesamiento de los puntos de datos. Ahora, esto se genera de alguna manera fácilmente usando Python, sin embargo, estoy buscando una forma de generar tal gráfico en mathica en un intento de mantener la coherencia del diseño entre mis otros gráficos.

Puedo generar fácilmente un ListDensityPlot usando:

ListDensityPlot[data]

Eso parece (con algunas opciones de manipulación de leyendas y gráficos ajustadas para que se vea "más presentable"):

Me las arreglé para convertir la parcela rectangular en circular usando la transformación de coordenadas, es decir

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

No estoy 100% seguro de que esto sea correcto para ser honesto, pero supongo que es el enfoque correcto, es decir, convertir coordenadas

Pero todavía no sé cómo agregar las líneas de la cuadrícula correctamente, la leyenda personalizada, es decir, el ángulo azimutal, supongo que siempre puedo agregar después a mano, pero se agradecería agregarlo mientras se traza también

Respuestas

3 xzczd Sep 30 2020 at 16:52

Aquí está mi prueba:

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]]}]]

El principal obstáculo que me impide crear una función de propósito general es que no está claro cómo PolarPlotdecide la posición de PolarAxes. (Terminé encontrando el método radian = 32;de prueba y error).