Membuat Setara Peta Panas Kutub Python (secara efektif ListDensityPolarPlot)

Sep 29 2020

Saya memiliki sekumpulan data yang ada di formulir

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

Atau untuk membuatnya lebih sederhana:

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

Alternatifnya, kumpulan data dapat dibuat dengan menggunakan:

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

Sekarang saya ingin memplot data ini dalam plot kutub untuk mendapatkan sesuatu yang setara dengan:

Dimana teks dalam gambar yang mengacu pada bidang kristal yang berbeda tidak penting. Untuk menghasilkan plot kerapatan yang seragam, harus ada beberapa interpolasi antara titik data tetapi saya rasa itu tidak perlu karena saya selalu dapat melakukannya dalam pemrosesan awal titik data. Sekarang ini agak mudah dibuat dengan menggunakan python, namun saya mencari cara untuk menghasilkan plot seperti itu di mathematica dalam upaya untuk menjaga konsistensi tata letak antara plot saya yang lain.

Saya dapat dengan mudah menghasilkan ListDensityPlot menggunakan:

ListDensityPlot[data]

Sepertinya (dengan beberapa manipulasi legenda dan opsi grafik yang disesuaikan agar terlihat "lebih rapi"):

Saya berhasil mengubah plot persegi panjang menjadi yang melingkar menggunakan transfromasi koordinat yaitu

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

Tidak 100% yakin bahwa ini benar, jujur ​​saja, tapi saya rasa ini adalah pendekatan yang tepat yaitu mengubah koordinat

Tapi saya masih belum tahu bagaimana cara menambahkan garis grid dengan benar, custom legendnya yaitu Azimuthal Angle. Saya rasa saya selalu bisa menambahkannya setelah itu dengan tangan tapi akan sangat dihargai untuk menambahkannya sambil merencanakan juga

Jawaban

3 xzczd Sep 30 2020 at 16:52

Inilah uji coba saya:

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

Hambatan utama yang menghentikan saya untuk membuat fungsi tujuan umum adalah, tidak jelas bagaimana PolarPlotmenentukan posisi dari PolarAxes. (Saya akhirnya menemukan radian = 32;by trial and error.)