MeshFunction in SmoothDensityHistogram
Vorrei creare un SmoothDensityHistogramset di dati in cui posso anche visualizzare il livello di probabilità all'interno di determinate regioni (concentriche). Ecco il codice:
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]
Il problema che ho è di indicare la probabilità circondata da ciascuna linea di maglia direttamente con un'etichetta sulla trama (simile a ciò che ContourPlotfa). Sto esaminando MeshFunctionma non riesco ad arrivare ai risultati che cerco. Idealmente, sono anche in grado di decidere le linee di maglia che vengono tracciate (ad esempio corrispondenti a probabilità del 60% e dell'80%).
EDIT
Ho anche provato l'approccio descritto qui:
Linee di contorno su SmoothDensityHistogram
funziona bene nell'identificare le linee della maglia. Tuttavia, non riesco ancora a capire come etichettarli in base alla probabilità che circondino (20, 40, 60 e 80% nell'esempio):
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]}}]]
Risposte
Combinando i due collegamenti nei commenti è possibile eseguire le seguenti operazioni:
(* 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]}}]]