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]
Kommentarer
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}]
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]
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]]
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
ellerSelect
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"]
Kommentarer
- stemmer for deg 🙂
- +1 for å være mye, mye raskere enn svar 1.
Image3D
…