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]
Kommentarer
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}]
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]
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]]
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
ellerSelect
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"]
Kommentarer
- röstar för dig 🙂
- +1 för att vara mycket, mycket snabbare än svar 1.
Image3D
…