3D-värmekartdensitetsdiagram

Jag har en uppsättning data som ser ut som {{x1, y1, z1}, {x2, y2, z2}, ...} så det beskriver punkter i 3D-rymden . Jag vill göra en värmekarta av dessa data. Så att punkter med hög densitet visas som ett moln och markeras med olika färger beroende på densiteten.

Jag vill faktiskt ha resultatet av detta skript bara för 3D:

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

ange bildbeskrivning här

Kommentarer

  • Välkommen till Mathematica.SE!
  • Har du version 9? Titta sedan på Image3D
  • Tack för svaret men nej jag använd Mathematica 8
  • Det är ett bra exempel !! för mig använde jag Image3D-funktionen i mathematica 9 men mitt problem är hur jag kan ändra dimensionerna för varje voxel med funktionen Image3D [].
  • Du bör ställa en annan fråga, inte lägga upp din fråga som ett svar .

Svar

Om du vill plotta en distribution som är tredimensionell måste du först skapa den ! SmoothDensityHistogram plottar ett jämnt kärnhistogram med värdena $ \ {x_i, y_i \} $ men eftersom vi har tredimensionella data här behöver vi funktionen som heter SmoothKernelDistribution!

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

Nu har du fått sannolikhetsfördelningen med tre variabler. Så vi kan helt enkelt plotta PDF som en 3d-konturplott med ContourPlot3D. Tänk på att den här funktionen anses vara lite långsam.

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

ange bildbeskrivning här

För att klippa igenom konturerna använde jag alternativet!

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

För att kontrollera att datapunkttätheten är ansvarig för formen på konturer kan vi använda Graphics3D

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

ange bildbeskrivning här

BR

EDIT

För att följa upp på 2D-exemplet och få varma färger för högre densiteter

 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 använder du ListContourPlot3D, redigera nevermind, resultatet är hemskt.
  • Bra tack, det skriptet med redigeringen gör precis det! En sak om jag kombinerar punktbilden med konturplott får jag följande: oi47.tinypic.com/34g7otd.jpg Jag markerade det område som är undantaget från konturplottet men innehåller några punkter …
  • @ user1936577 Tänk på att använda ett enklare användarnamn;) Nu måste du också använda samma uteslutning på dina punkter så att alla punkter inte visas. Du kan använda Cases eller Select för att välja relevanta punkter.
  • ändrade bara namnet;) Men jag vill att tänka på alla punkter i min ContourPlot och nu undrar jag ' om det här området som jag markerade i länken ovan

Svar

Koden nedan (anpassad från här ) ger en utgång som liknar funktionen Image3D som tyvärr endast är tillgängligt för Mathematica version 9.

Några slumpmässiga 3D-data:

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

Här anger vi domänen till bin (-3, 3) och binningupplösningen:

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

Den faktiska koden som ska produceras 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

  • röstar för dig 🙂
  • +1 för att vara mycket, mycket snabbare än svar 1.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *