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
Cases
oSelect
per 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
…