3D hőtérkép sűrűségdiagram

Van egy adatsorom, amely úgy néz ki, mint {{x1, y1, z1}, {x2, y2, z2}, ...}, így leírja a 3D tér pontjait . Hőtérképet szeretnék készíteni ezekből az adatokból. Tehát a nagy sűrűségű pontok felhőként jelennek meg, és a sűrűségtől függően különböző színekkel vannak jelölve.

Valójában csak 3D-re szeretném a szkript eredményét:

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

írja ide a kép leírását

Megjegyzések

  • Üdvözöljük a Mathematica.SE oldalon!
  • Rendelkezik a 9-es verzióval? Ezután nézze meg a Image3D
  • köszönöm a választ, de nem I használja a Mathematica 8
  • Nagyszerű példa !! számomra a mathematica 9 Image3D függvényét használtam, de az a problémám, hogy miként változtathatom meg az egyes voxelek méreteit az Image3D [] függvény használatával.
  • Más kérdést kell feltennie, és nem kérdésként válaszként feltenni. .

Válasz

Ha háromdimenziós elosztást szeretne ábrázolni, akkor először létre kell hoznia ! A SmoothDensityHistogram sima kernel hisztogramot rajzol az $ \ {x_i, y_i \} $ értékekre, de mivel itt háromdimenziós adatok állnak rendelkezésünkre, szükségünk van a SmoothKernelDistribution!

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

Most megkapta a valószínűségeloszlást három változóval. Tehát egyszerűen felrajzolhatjuk a PDF -et 3d kontúr-diagramként a ContourPlot3D segítségével. Ne feledje, hogy ez a függvény kissé lassúnak számít.

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

ide írja be a kép leírását

A kontúrok átvágásához az opciót használtam!

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

Annak ellenőrzésére, hogy az adatpont sűrűsége felelős-e a kontúrokat használhatunk Graphics3D

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

ide írja be a kép leírását

BR

SZERKESZTÉS

Követés fel a 2D példán, és meleg színeket kaphat a nagyobb sűrűségért

 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 grafika

Megjegyzések

  • ' nem használhatja a ListContourPlot3D, szerkesztés soha, az eredmény borzalmas.
  • Nagyon köszönöm, hogy az a szkript a szerkesztéssel pontosan elvégzi a munkát! Egy dolog, ha összekapcsolom a Pontképet a kontúrdiagrammal, a következőt kapom: a kontúrdiagram, de tartalmaz néhány pontot …
  • @ user1936577 kérjük, fontolja meg, hogy egyszerűbb felhasználói nevet használ; Használhatja a Cases vagy a Select elemet a releváns pontok kiválasztásához.
  • csak megváltoztatta a nevet;) De szeretném hogy figyelembe vegyem a ContourPlot összes pontját, és most ' kíváncsi vagyok erre a területre, amelyet a fenti linken jelöltem

Válasz

Az alábbi kód ( itt átdolgozva ) olyan kimenetet állít elő, amely hasonló a Image3D, amely sajnos csak a Mathematica 9-es verzióhoz érhető el.

Néhány véletlenszerű 3D-s adat:

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

Itt adjuk meg a bin (-3, 3) tartományt és az összekapcsolási felbontást:

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

A tényleges előállítandó kód az ábra:

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

voxelek

megjegyzések

  • szavazzon neked 🙂
  • +1, mert sokkal, de sokkal gyorsabb, mint az 1. válasz.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük