Pythonの同等の極地ヒートマップの作成(事実上ListDensityPolarPlot)
次の形式のデータセットがあります
{{\[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];
次に、このデータを極座標プロットにプロットして、次と同等のものを取得します。
異なる結晶面を参照している写真のテキストは重要ではありません。均一な密度プロットを生成するには、データポイント間に補間が必要ですが、データポイントの前処理でいつでも実行できるため、これは必要ないと思います。現在、これはpythonを使用していくらか簡単に生成されますが、他のプロット間のレイアウトの一貫性を維持するために、数学でそのようなプロットを生成する方法を探しています。
次を使用して、ListDensityPlotを簡単に生成できます。
ListDensityPlot[data]
それは次のようになります(いくつかの凡例の操作とグラフィックオプションを調整して、「より見栄えのする」ように見せます):
座標の変換を使用して、長方形のプロットを円形のプロットに変換することができました。
N[{#[[1]] Cos[#[[2]]], #[[1]] Sin[#[[2]]], #[[3]]}] & /@data
これが正直に正しいかどうかは100%確実ではありませんが、正しいアプローチ、つまり座標の変換だと思います
しかし、グリッド線を適切に追加する方法はまだわかりません。カスタムの凡例、つまり方位角は、後でいつでも手動で追加できると思いますが、プロットしながら追加していただければ幸いです。
回答
これが私の試練です:
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;試行錯誤で見つけてしまいました。)