Здесь есть две отдельные проблемы: определение подходящих размеров ячеек и функций подсчета для сферы, чтобы вы могли построить соответствующую цветовую функцию, а затем построение этой цветовой функции на трехмерной сфере.Я предоставлю решение Mathematica для обоих.
1.Составление примерных данных
Для начала приведу несколько примерных данных:
data = Map[
Apply@Function[{x, y, z},
{
Mod[ArcTan[x, y], 2 π],
ArcSin[z/Sqrt[x^2 + y^2 + z^2]]
}
],
Map[
#/Norm[#]&,
Select[
RandomReal[{-1, 1}, {200000, 3}],
And[
Norm[#] > 0.01,
Or[
Norm[# - {0, 0.3, 0.2}] < 0.6,
Norm[# - {-0.3, -0.15, -0.3}] < 0.3
]
] &
]
]
]
Я сделал его немного кусковатым, чтобы у него было больше интересных функций, когда дело доходит до графика..
2.Построение цветовой функции
Для построения цветовой функции в Mathematica самое чистое решение - использовать HistogramList
, но это необходимо изменить, чтобы учесть тот факт, что ящики на высокой широтебудет иметь различные области, поэтому плотность должна быть скорректирована.
Тем не менее, встроенные инструменты построения гистограммы довольно хороши:
DensityHistogram[
data,
{5°}
, AspectRatio -> Automatic
, PlotRangePadding -> None
, ImageSize -> 700
]
Вы можете получить необработанные данные через
{{ϕbins, θbins}, counts} = HistogramList[data, {15°}]
, а затем для удобства давайте определим
ϕcenters = 1/2 (Most[ϕbins] + Rest[ϕbins])
θcenters = 1/2 (Most[θbins] + Rest[θbins])
с областью бункера, вычисленной с использованием
SectorArea[ϕmin_, ϕmax_, θmin_, θmax_] = (Abs[ϕmax - ϕmin]/(4 π)) *
Integrate[Sin[θ], {θ, θmin, θmax}]
.Вы можете определить свою собственную цветовую функцию как
function[ϕ_, θ_] := With[{
iϕ = First[Nearest[ϕcenters -> Range[Length[ϕcenters]], ϕ]],
iθ = First[Nearest[θcenters -> Range[Length[θcenters]], θ]]
},
(N@counts[[iϕ, iθ]]/
SectorArea[ϕbins[[iϕ]], ϕbins[[iϕ + 1]], θbins[[iθ]], θbins[[iθ + 1]]])/max
]
Итак, вот эта функция в действии:
texture = ListDensityPlot[
Flatten[
Table[
{
ϕcenters[[iϕ]],
θcenters[[iθ]],
function[ϕcenters[[iϕ]], θcenters[[iθ]]]
}
, {iϕ, Length[ϕbins] - 1}
, {iθ, Length[θbins] - 1}
], 1]
, InterpolationOrder -> 0
, AspectRatio -> Automatic
, ColorFunction -> ColorData["GreenBrownTerrain"]
, Frame -> None
, PlotRangePadding -> None
]
3.Построение графика
Чтобы построить данные на сфере, я вижу два основных варианта: вы можете создать график поверхности, а затем обернуть его вокруг параметрического графика как Texture
, как в
ParametricPlot3D[
{Cos[ϕ] Sin[θ], Sin[ϕ] Sin[θ],
Cos[θ]}
, {ϕ, 0, 2 π}, {θ, 0, π}
, Mesh -> None
, Lighting -> "Neutral"
, PlotStyle -> Directive[
Specularity[White, 30],
Texture[texture]
]
]
Или вы можете определить его как явное ColorFunction
на том же параметрическом графике:
ParametricPlot3D[
{Cos[ϕ] Sin[θ], Sin[ϕ] Sin[θ],
Cos[θ]}
, {ϕ, 0, 2 π}, {θ, 0, π}
, ColorFunctionScaling -> False
, ColorFunction -> Function[{x, y, z, ϕ, θ},
ColorData["GreenBrownTerrain"][function[ϕ, θ]]
]
]
Все вышеперечисленное, конечно, очень модульно, поэтому вы можете свободно комбинировать и сочетать в своих интересах.