3D-varmekort-tæthedsdiagram

Jeg har et sæt data, der ligner {{x1, y1, z1}, {x2, y2, z2}, ...}, så det beskriver punkter i 3D-rummet . Jeg vil lave et heatmap ud af disse data. Så punkter med høj tæthed vises som en sky og markeret med forskellige farver afhænger af densiteten.

Faktisk vil jeg have resultatet af dette script kun til 3D:

data = RandomReal[1, {100, 2}]; SmoothDensityHistogram[data, 0.02, "PDF", ColorFunction -> "Rainbow", Mesh -> 0] 

indtast billedebeskrivelse her

Kommentarer

  • Velkommen til Mathematica.SE!
  • Har du version 9? Så kig på Image3D
  • Tak for svaret men nej jeg brug Mathematica 8
  • Det er et godt eksempel !! for mig brugte jeg Image3D-funktionen i mathematica 9, men mit problem er, hvordan jeg kan ændre dimensionerne på hver voxel ved hjælp af Image3D [] -funktionen.
  • Du skal stille et andet spørgsmål, ikke placere dit spørgsmål som et svar .

Svar

Hvis du vil plotte en distribution, der er tredimensionel, skal du først danne den ! SmoothDensityHistogram plotter et glat kernehistogram med værdierne $ \ {x_i, y_i \} $, men da vi har tredimensionelle data her, har vi brug for funktionen kaldet SmoothKernelDistribution!

data = RandomReal[1, {1000, 3}]; dist = SmoothKernelDistribution[data]; 

Nu har du sandsynlighedsfordelingen med tre variabler. Så vi kan simpelthen plotte PDF som et 3d kontur plot ved hjælp af ContourPlot3D. Husk, at denne funktion siges at være lidt langsom.

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

indtast billedbeskrivelse her

For at skære igennem konturerne brugte jeg muligheden!

RegionFunction -> Function[{x, y, z}, x < z || z > y] 

For at kontrollere, at datapunkttætheden er ansvarlig for formen på konturer kan vi bruge Graphics3D

pic = Graphics3D[{ColorData["DarkRainbow"][#[[3]]], PointSize -> Large, Point[#]} & /@ data, Boxed -> False]; Show[con, pic] 

indtast billedbeskrivelse her

BR

REDIGER

For at følge op på 2D-eksemplet og få varme farver til højere tætheder

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

Mathematica-grafik

Kommentarer

  • Kan ' t bruger du ListContourPlot3D, rediger nevermind, resultatet er forfærdeligt.
  • Stor tak, det script med redigeringen fungerer nøjagtigt! Én ting, hvis jeg kombinerer punktbilledet med konturplottet, får jeg følgende: oi47.tinypic.com/34g7otd.jpg Jeg markerede det område, der er udelukket fra konturplottet, men indeholder nogle punkter …
  • @ user1936577 Overvej venligst at bruge et enklere brugernavn;) Nu skal du også bruge samme udelukkelse på dine punkter, så alle punkter ikke vises. Du kan bruge Cases eller Select til at vælge de relevante punkter.
  • har lige ændret navnet;) Men jeg vil at overveje alle punkter i min ContourPlot og nu ' undrer mig over dette område, som jeg markerede i linket ovenfor

Svar

Koden nedenfor (tilpasset fra her ) producerer en output, der svarer til funktionen Image3D der desværre kun er tilgængelig for Mathematica version 9.

Nogle tilfældige 3D-data:

data = RandomReal[{-3, 3}, {5000, 3}]; 

Her angiver vi domænet til bin (-3, 3) og binningopløsningen:

binning = {-3, 3, .5}; 

Den aktuelle kode, der skal produceres figuren:

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

voxels

Kommentarer

  • stemmer for dig 🙂
  • +1 for at være meget, meget hurtigere end svar 1.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *