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]
Kommentarer
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}]
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]
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]]
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
ellerSelect
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"]
Kommentarer
- stemmer for dig 🙂
- +1 for at være meget, meget hurtigere end svar 1.
Image3D
…