Graf hustoty 3D tepelné mapy

Mám sadu dat, která vypadá jako {{x1, y1, z1}, {x2, y2, z2}, ...}, takže popisuje body v 3D prostoru . Z těchto dat chci vytvořit teplotní mapu. Takže body s vysokou hustotou jsou zobrazeny jako mrak a jsou označeny různými barvami v závislosti na hustotě.

Ve skutečnosti chci výsledek tohoto skriptu pouze pro 3D:

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

zde zadejte popis obrázku

Komentáře

  • Vítejte na Mathematica.SE!
  • Máte verzi 9? Pak se podívejte na Image3D
  • Děkuji za odpověď, ale ne použijte Mathematica 8
  • Je to skvělý příklad !! pro mě jsem použil funkci Image3D v matematice 9, ale mým problémem je, jak mohu změnit rozměry každého voxelu pomocí funkce Image3D [].
  • Měli byste se zeptat na jinou otázku, ne posílat svou otázku jako odpověď .

Odpověď

Chcete-li vykreslit distribuci, která je trojrozměrná, musíte ji nejprve vytvořit ! SmoothDensityHistogram vykreslí hladký histogram jádra hodnot $ \ {x_i, y_i \} $, ale protože zde máme trojrozměrná data, potřebujeme funkci s názvem SmoothKernelDistribution!

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

Nyní máte rozdělení pravděpodobnosti se třemi proměnnými. Můžeme tedy jednoduše PDF vykreslit jako 3D obrysový graf pomocí ContourPlot3D. Mějte na paměti, že tato funkce je považována za pomalou.

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

zde zadejte popis obrázku

K proříznutí obrysů jsem použil tuto možnost!

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

Aby bylo možné zkontrolovat, že hustota datových bodů odpovídá za tvar kontury, které můžeme použít Graphics3D

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

zde zadejte popis obrázku

BR

EDIT

Sledovat na příkladu 2D a získejte teplé barvy pro vyšší hustoty

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

grafika Mathematica

Komentáře

  • Nelze ' použít ListContourPlot3D, upravit nevadí, výsledek je hrozný.
  • Děkuji, tento skript s úpravou přesně funguje! Jedna věc, pokud zkombinuji obrázek bodu s obrysovým grafem, dostanu následující: oi47.tinypic.com/34g7otd.jpg Označil jsem oblast, která je vyloučena z obrysový graf, ale obsahuje některé body …
  • @ user1936577 zvažte použití jednoduššího uživatelského jména;) Nyní musíte také použít stejné vyloučení pro své body, aby se všechny body nezobrazily. K výběru příslušných bodů můžete použít Cases nebo Select.
  • právě jste změnili název;) Ale chci zvážit všechny body v mém ContourPlot a nyní se ' zajímám o tuto oblast, kterou jsem označil v odkazu výše

odpověď

Níže uvedený kód (upravený z zde ) vytvoří výstup podobný funkci Image3D který je bohužel k dispozici pouze pro Mathematica verze 9.

Některá náhodná 3D data:

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

Zde zadáme doménu k binování (-3, 3) a rozlišení binningu:

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

Skutečný kód k produkci obrázek:

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

voxels

Komentáře

  • hlasujte pro vás 🙂
  • +1 za to, že je mnohem, mnohem rychlejší než odpověď 1.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *