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]
Reacties
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}]
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]
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]]
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
ofSelect
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"]
Opmerkingen
- upvote voor jou 🙂
- +1 omdat je veel, veel sneller bent dan antwoord 1.
Image3D
…