3D-heatmap-dichtheidsplot

Ik heb een set gegevens die eruitziet als {{x1, y1, z1}, {x2, y2, z2}, ...}, dus het beschrijft punten in 3D-ruimte . Ik wil van deze gegevens een heatmap maken. Zodat punten met een hoge dichtheid worden weergegeven als een wolk en gemarkeerd met verschillende kleuren afhankelijk van de dichtheid.

In feite wil ik het resultaat van dit script alleen voor 3D:

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

voer de beschrijving van de afbeelding hier in

Reacties

  • Welkom bij Mathematica.SE!
  • Heeft u versie 9? Kijk dan eens naar Image3D
  • Bedankt voor het antwoord, maar nee, ik gebruik Mathematica 8
  • Het is een geweldig voorbeeld !! voor mij heb ik de Image3D-functie van mathematica 9 gebruikt, maar mijn probleem is hoe ik de afmetingen van elke voxel kan veranderen met de Image3D [] -functie.
  • Je zou een andere vraag moeten stellen, niet je vraag als antwoord posten .

Answer

Als u een driedimensionale verdeling wilt uitzetten, moet u deze eerst vormen ! SmoothDensityHistogram tekent een vloeiend kernelhistogram van de waarden $ \ {x_i, y_i \} $, maar aangezien we hier driedimensionale gegevens hebben, hebben we de functie SmoothKernelDistribution!

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

Nu heb je de kansverdeling met drie variabelen. We kunnen dus eenvoudig de PDF plotten als een 3D-contourplot met ContourPlot3D. Houd er rekening mee dat deze functie een beetje traag is.

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

voer hier de afbeeldingsbeschrijving in

Om door de contouren te snijden heb ik de optie gebruikt!

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

Om te controleren of de dichtheid van de datapunten verantwoordelijk is voor de vorm van de contouren die we kunnen gebruiken Graphics3D

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

voer de beeldbeschrijving hier in

BR

EDIT

Om te volgen op het 2D-voorbeeld en krijg warme kleuren voor hogere dichtheden

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

Opmerkingen

  • Kunnen ' je ListContourPlot3D, bewerken laat maar, het resultaat is vreselijk.
  • Geweldig bedankt, dat script met de bewerking doet precies het werk! Eén ding als ik de puntafbeelding combineer met de contourplot, krijg ik het volgende: oi47.tinypic.com/34g7otd.jpg Ik heb het gebied gemarkeerd dat is uitgesloten van de contourplot maar bevat enkele punten …
  • @ user1936577 overweeg alstublieft om een eenvoudigere gebruikersnaam te gebruiken;) Nu moet u ook dezelfde uitsluiting voor uw punten gebruiken, zodat niet alle punten worden weergegeven. Je kunt Cases of Select gebruiken om de relevante punten te kiezen.
  • zojuist de naam gewijzigd;) Maar ik wil om alle punten in mijn ContourPlot in overweging te nemen en nu ' vraag ik me af over dit gebied dat ik in de bovenstaande link heb gemarkeerd

Antwoord

De onderstaande code (aangepast van hier ) produceert een uitvoer die vergelijkbaar is met de functie Image3D die helaas alleen beschikbaar is voor Mathematica versie 9.

Enkele willekeurige 3D-gegevens:

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

Hier specificeren we het domein naar bin (-3, 3) en de binning-resolutie:

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

De daadwerkelijke code die moet worden geproduceerd de figuur:

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

Opmerkingen

  • upvote voor jou 🙂
  • +1 omdat je veel, veel sneller bent dan antwoord 1.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *