MeshFunction в SmoothDensityHistogram

Oct 22 2020

Я хотел бы создать SmoothDensityHistogramнабор данных, в котором я также могу визуализировать уровень вероятности внутри определенных (концентрических) областей. Вот код:

somePoints = 
  RandomReal[BinormalDistribution[{-2, 2}, {1, 1}, .8], 1000];

SmoothDensityHistogram[somePoints,
 Automatic, "PDF",
 ColorFunction -> "DarkBands",
 BaseStyle -> {FontSize -> 34, FontFamily -> "Arial"},
 FrameStyle -> Directive[Black, AbsoluteThickness[3]],
 ImageSize -> 800,
 AspectRatio -> 0.5,
 PlotRange -> All,
 MeshStyle -> Black,
 Mesh -> 5]

Проблема, которая у меня есть, заключается в том, чтобы указать вероятность, обведенную каждой линией сетки, непосредственно с меткой на графике (аналогично тому, что ContourPlotесть). Я изучаю, MeshFunctionно не могу прийти к результатам, которые ищу. В идеале я также могу определить линии сетки, которые будут построены (например, соответствующие вероятностям 60% и 80%).

ИЗМЕНИТЬ
Я также попробовал описанный здесь подход:

Контурные линии поверх SmoothDensityHistogram

он хорошо работает при идентификации линий сетки. Однако я до сих пор не могу понять, как их пометить в зависимости от вероятности того, что они окружены (в примере 20, 40, 60 и 80%):

  RandomReal[BinormalDistribution[{-2, 2}, {1, 1}, .8], 1000];
d = SmoothKernelDistribution[somePoints];

Show[SmoothDensityHistogram[somePoints,
  Automatic, "PDF",
  ColorFunction -> "DarkBands",
  BaseStyle -> {FontSize -> 34, FontFamily -> "Arial"},
  FrameStyle -> Directive[Black, AbsoluteThickness[3]],
  ImageSize -> 800,
  AspectRatio -> 0.5,
  PlotRange -> All,
  MeshStyle -> Black,
  Mesh -> 0],
 
 ContourPlot[PDF[d, {x, y}], {x, -4, 4}, {y, -5, 5},
  PlotRange -> All,
  Contours -> 
   Function[{min, max}, 
    Rescale[{0.2, 0.4, 0.6, 0.8}, {0, 1}, {min, max}]],
  ContourShading -> None,
  ContourStyle -> {{Black, AbsoluteThickness[3]}}]]

Ответы

3 JimB Oct 22 2020 at 05:21

Комбинируя две ссылки в комментариях, можно сделать следующее:

(* Generate some data *)
SeedRandom[12345];
somePoints = RandomVariate[BinormalDistribution[{-2, 2}, {1, 1}, 0.8], 1000];

(* Construct smooth kernel distribution *)
d = SmoothKernelDistribution[somePoints];

(* Find the pdf values on a fine grid and sort by value of pdf *)
pdf = Reverse[Sort[Flatten[Table[PDF[d, {x, y}], {x, -7, 3, 0.05}, {y, -3, 6, 0.05}]]]];
(* Obtain cdf of those values *)
cdf = Accumulate[pdf]/Total[pdf];

(* Give labels for probabilities of interest *)
probabilities = {"0.2", "0.4", "0.6", "0.8"};

(* Determine contours associated with each probability *)
contours = pdf[[Flatten[Table[FirstPosition[cdf, p_ /; p >= alpha], {alpha, ToExpression[probabilities]}]]]];

(* Construct link between the contours and the probability labels along with the desired style of text *)
link = AssociationThread[contours -> probabilities];
f = Text[Style[link[#3], 15, Bold, Red], {#1, #2}] &;

(* Plot results *)
Show[SmoothDensityHistogram[somePoints, Automatic, "PDF", ColorFunction -> "DarkBands",
  BaseStyle -> {FontSize -> 34, FontFamily -> "Arial"},
  FrameStyle -> Directive[Black, AbsoluteThickness[3]], ImageSize -> 800,
  AspectRatio -> 0.5, PlotRange -> All, MeshStyle -> Black, Mesh -> 0],
 ContourPlot[PDF[d, {x, y}], {x, -7, 3}, {y, -3, 6}, PlotRange -> All,
  Contours -> contours, ContourLabels -> f, ContourShading -> None,
  ContourStyle -> {{Black, AbsoluteThickness[3]}}]]