Grafico della densità della mappa di calore 3D

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] 

inserisci qui la descrizione dellimmagine

Commenti

  • Benvenuto in Mathematica.SE!
  • Hai la versione 9? Quindi dai unocchiata a Image3D
  • Grazie per la risposta ma no io usa Mathematica 8
  • È un ottimo esempio !! per me ho usato la funzione Image3D di matematica 9 ma il mio problema è come posso cambiare le dimensioni di ogni voxel usando la funzione Image3D [].
  • Dovresti fare una domanda diversa, non pubblicare la tua domanda come risposta .

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}] 

inserisci qui la descrizione dellimmagine

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] 

inserisci qui la descrizione dellimmagine

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]] 

Grafica Mathematica

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 o Select 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"] 

voxel

Commenti

  • voto positivo per te 🙂
  • +1 per essere molto, molto più veloce della risposta 1.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *