3D-varmekart tetthetsplott

Jeg har et sett med data som ser ut som {{x1, y1, z1}, {x2, y2, z2}, ...} så det beskriver punkter i 3D-rom . Jeg vil lage et varmekart ut av disse dataene. Slik at punkter med høy tetthet vises som en sky og merket med forskjellige farger, avhengig av tettheten.

Jeg vil faktisk ha resultatet av dette skriptet bare for 3D:

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

skriv inn bildebeskrivelse her

Kommentarer

  • Velkommen til Mathematica.SE!
  • Har du versjon 9? Så ta en titt på Image3D
  • Takk for svaret, men nei jeg bruk Mathematica 8
  • Det er et godt eksempel !! for meg brukte jeg Image3D-funksjonen til mathematica 9, men problemet mitt er hvordan jeg kan endre dimensjonene på hver voxel ved hjelp av Image3D [] -funksjonen.
  • Du bør stille et annet spørsmål, ikke legge spørsmålet ditt som svar .

Svar

Hvis du vil tegne en fordeling som er tredimensjonal, må du først danne den ! SmoothDensityHistogram plotter et glatt kjernehistogram med verdiene $ \ {x_i, y_i \} $, men da vi har tredimensjonale data her, trenger vi funksjonen kalt SmoothKernelDistribution!

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

Nå har du fått sannsynlighetsfordelingen med tre variabler. Så vi kan ganske enkelt plotte PDF som et 3d-konturplott ved hjelp av ContourPlot3D. Husk at denne funksjonen er kjent for å være litt treg.

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

skriv inn bildebeskrivelse her

For å kutte gjennom konturene brukte jeg alternativet!

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

For å kontrollere at datapunkttettheten er ansvarlig for formen på konturer kan vi bruke Graphics3D

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

skriv inn bildebeskrivelse her

BR

EDIT

For å følge opp på 2D-eksemplet og få varme farger for høyere tetthet

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

Kommentarer

  • Kan ' t du bruker ListContourPlot3D, rediger nevermind, resultatet er fryktelig.
  • Stor takk, det skriptet med redigeringen gjør akkurat arbeidet! En ting hvis jeg kombinerer punktbildet med konturplottet, får jeg følgende: oi47.tinypic.com/34g7otd.jpg Jeg markerte området som er unntatt fra konturplottet, men inneholder noen punkter …
  • @ user1936577 Vennligst vurder å bruke et enklere brukernavn;) Nå må du også bruke samme ekskludering på poengene dine, slik at alle punkter ikke vises. Du kan bruke Cases eller Select for å velge de aktuelle punktene.
  • bare endret navnet;) Men jeg vil å vurdere alle punktene i ContourPlot og nå lurer jeg ' på dette området som jeg markerte i lenken over

Svar

Koden nedenfor (tilpasset fra her ) gir en utgang som ligner på funksjonen Image3D som dessverre bare er tilgjengelig for Mathematica versjon 9.

Noen tilfeldige 3D-data:

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

Her spesifiserer vi domenet til kassen (-3, 3) og binningoppløsningen:

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

Den faktiske koden som skal produseres 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 deg 🙂
  • +1 for å være mye, mye raskere enn svar 1.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *