Python의 Polar Heat Map 동등 물 생성 (효과적으로 ListDensityPolarPlot)

Sep 29 2020

다음 형식의 데이터 세트가 있습니다.

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

또는 더 간단하게 만들려면 :

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

또는 다음을 사용하여 데이터 세트를 생성 할 수 있습니다.

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

이제이 데이터를 극좌표로 플로팅하여 다음과 같은 것을 얻습니다.

다른 결정면을 가리키는 그림의 텍스트는 중요하지 않습니다. 균일 한 밀도 플롯을 생성하려면 데이터 포인트 사이에 약간의 보간이 있어야하지만 데이터 포인트의 전처리에서 항상 할 수 있으므로 필요하지 않은 것 같습니다. 이제 이것은 파이썬을 사용하여 다소 쉽게 생성되지만 다른 플롯 간의 레이아웃 일관성을 유지하기 위해 mathematica에서 그러한 플롯을 생성하는 방법을 찾고 있습니다.

다음을 사용하여 ListDensityPlot을 쉽게 생성 할 수 있습니다.

ListDensityPlot[data]

다음과 같습니다 (일부 범례 조작 및 그래픽 옵션이 "더보기 좋게"보이도록 조정 됨).

나는 좌표의 변환을 사용하여 직사각형 플롯을 원형 플롯으로 변환했습니다.

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

이것이 정직하게 옳다고 100 % 확신하지는 않지만, 이것이 올바른 접근 방식이라고 생각합니다. 즉, 좌표 변환

그러나 나는 여전히 그리드 선을 올바르게 추가하는 방법을 모르겠습니다. 사용자 정의 범례, 즉 Azimuthal Angle 나는 항상 나중에 손으로 추가 할 수 있다고 생각하지만 플롯하는 동안 추가하는 것이 좋습니다.

답변

3 xzczd Sep 30 2020 at 16:52

내 재판은 다음과 같습니다.

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

범용 함수를 만드는 데 방해가되는 주된 장애물 PolarPlot은의 위치를 ​​결정하는 방법이 명확하지 않다는 것 입니다 PolarAxes. (나는 radian = 32;시행 착오를 통해 결국 찾았습니다 .)