Ho un insieme di dati che assomiglia a {{x1, y1, z1}, {x2, y2, z2}, ...}, quindi descrive punti nello spazio 3D . Voglio creare una mappa di calore con questi dati. In modo che i punti con unalta densità vengano visualizzati come una nuvola e contrassegnati con colori diversi a seconda della densità.
In effetti, voglio il risultato di questo script solo per il 3D:
data = RandomReal[1, {100, 2}]; SmoothDensityHistogram[data, 0.02, "PDF", ColorFunction -> "Rainbow", Mesh -> 0]
Commenti
Risposta
Se vuoi tracciare una distribuzione tridimensionale, prima devi formarla ! SmoothDensityHistogram traccia un istogramma del kernel uniforme dei valori $ \ {x_i, y_i \} $ ma poiché qui abbiamo dati tridimensionali abbiamo bisogno della funzione chiamata SmoothKernelDistribution!
data = RandomReal[1, {1000, 3}]; dist = SmoothKernelDistribution[data];
Ora hai la distribuzione di probabilità con tre variabili. Quindi possiamo semplicemente tracciare PDF come un grafico di contorno 3D utilizzando ContourPlot3D. Tieni presente che si ritiene che questa funzione sia un po lenta.
ContourPlot3D[Evaluate@PDF[dist, {x, y, z}], {x, -2, 2}, {y, -2, 2}, {z, -2, 2}, PlotRange -> All, Mesh -> None, MaxRecursion -> 0, PlotPoints -> 160, ContourStyle -> Opacity[0.45], Mesh -> None, ColorFunction -> Function[{x, y, z, f}, ColorData["Rainbow"][z]], AxesLabel -> {x, y, z}]
Per tagliare i contorni ho usato lopzione!
RegionFunction -> Function[{x, y, z}, x < z || z > y]
Per verificare che la densità dei punti dati sia responsabile della forma del contorni che possiamo utilizzare Graphics3D
pic = Graphics3D[{ColorData["DarkRainbow"][#[[3]]], PointSize -> Large, Point[#]} & /@ data, Boxed -> False]; Show[con, pic]
BR
EDIT
Per seguire sullesempio 2D e ottieni colori caldi per densità più elevate
data = RandomReal[1, {500, 3}]; dist = SmoothKernelDistribution[data]; ContourPlot3D[Evaluate@PDF[dist, {x, y, z}], {x, -2, 2}, {y, -2, 2}, {z, -2, 2},PlotRange -> All, Mesh -> None, MaxRecursion -> 0, PlotPoints -> 150, ContourStyle -> Opacity[0.45], Contours -> 5, Mesh -> None, ColorFunction -> Function[{x, y, z, f}, ColorData["Rainbow"][f/Max[data]]], AxesLabel -> {x, y, z}, RegionFunction -> Function[{x, y, z}, x < z || z > y]]
Commenti
- Non è possibile ' utilizzare
ListContourPlot3D, modifica non importa, il risultato è orribile. - Grazie mille, quello script con la modifica fa esattamente il lavoro! Una cosa se combino limmagine Punto con il grafico di contorno ottengo quanto segue: oi47.tinypic.com/34g7otd.jpg Ho contrassegnato larea che è esclusa il contour plot ma contiene alcuni punti …
- @ user1936577 per favore considera di usare un nome utente più semplice;) Ora devi anche usare la stessa esclusione sui tuoi punti in modo che tutti i punti non siano mostrati. Puoi utilizzare
CasesoSelectper scegliere i punti pertinenti. - ho appena cambiato il nome;) Ma voglio per considerare tutti i punti nel mio ContourPlot e ora ' mi chiedo su questarea che ho contrassegnato nel link sopra
Risposta
Il codice seguente (adattato da qui ) produce un output simile alla funzione Image3D che è purtroppo disponibile solo per Mathematica versione 9.
Alcuni dati 3D casuali:
data = RandomReal[{-3, 3}, {5000, 3}];
Qui specifichiamo il dominio per bin (-3, 3) e la risoluzione del binning:
binning = {-3, 3, .5};
Il codice effettivo da produrre la figura:
binned = BinCounts[data, binning, binning, binning]; dims = Dimensions@binned; normbinned = N[binned/Max[binned]]; coordswithdataAll = Table[{normbinned[[x, y, z]], {x, y, z}}, {x, 1, dims[[1]]}, {y, 1, dims[[2]]}, {z, 1, dims[[3]]}]; coordswithdata = Table[Select[coordswithdataAll[[j, i]], #[[1]] != 0 &], {j, dims[[1]]}, {i, dims[[1]]}]; cubes = {ColorData["Rainbow"][#1], Opacity@#1, EdgeForm[], Cuboid@#2} &; output = ParallelMap[cubes @@ # &, coordswithdata, {3}]; Graphics3D[output, PlotRange -> Transpose[{ConstantArray[1, 3], dims + 1}], Lighting -> "Neutral"]
Commenti
- voto positivo per te 🙂
- +1 per essere molto, molto più veloce della risposta 1.
Image3D…