Graficul densității hărții 3D

Am un set de date care arată ca {{x1, y1, z1}, {x2, y2, z2}, ...}, deci descrie punctele din spațiul 3D . Vreau să fac o hartă din aceste date. Astfel, punctele cu o densitate mare sunt afișate ca un nor și marcate cu culori diferite în funcție de densitate.

De fapt, doresc rezultatul acestui script doar pentru 3D:

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

introduceți descrierea imaginii aici

Comentarii

  • Bine ați venit la Mathematica.SE!
  • Aveți versiunea 9? Apoi aruncă o privire la Image3D
  • Vă mulțumim pentru răspuns, dar nu folosiți Mathematica 8
  • Este un exemplu grozav !! pentru mine am folosit funcția Image3D a matematicica 9, dar problema mea este cum pot modifica dimensiunile fiecărui voxel folosind funcția Image3D [].
  • Ar trebui să puneți o întrebare diferită, nu să postați întrebarea ca răspuns .

Răspuns

Dacă doriți să reprezentați o distribuție tridimensională, atunci mai întâi trebuie să o formați ! SmoothDensityHistogram trasează o histogramă a nucleului netedă a valorilor $ \ {x_i, y_i \} $, dar, deoarece avem date tridimensionale aici, avem nevoie de funcția numită SmoothKernelDistribution!

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

Acum aveți distribuția probabilității cu trei variabile. Deci, putem pur și simplu să reprezentăm PDF ca un contur de contur 3d utilizând ContourPlot3D. Rețineți că această funcție este considerată a fi puțin lentă.

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

introduceți descrierea imaginii aici

Pentru a tăia contururile am folosit opțiunea!

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

Pentru a verifica dacă densitatea punctelor de date este responsabilă pentru forma contururi pe care le putem folosi Graphics3D

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

introduceți descrierea imaginii aici

BR

EDIT

De urmat sus pe exemplul 2D și obțineți culori calde pentru densități mai mari

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

Grafică Mathematica

Comentarii

  • ' nu poți folosi ListContourPlot3D, edit nevermind, rezultatul este oribil.
  • Mulțumesc, scriptul cu editare funcționează exact! Un lucru dacă combin imaginea Point cu graficul de contur obțin următoarele: oi47.tinypic.com/34g7otd.jpg Am marcat zona care este exclusă din graficul de contur, dar conține câteva puncte …
  • @ user1936577 vă rugăm să luați în considerare utilizarea unui nume de utilizator mai simplu;) Acum trebuie să utilizați aceeași excludere pentru punctele dvs., astfel încât să nu fie afișate toate punctele. Puteți utiliza Cases sau Select pentru a alege punctele relevante.
  • tocmai am schimbat numele;) Dar vreau să iau în considerare toate punctele din ContourPlot și acum ' mă întreb despre această zonă pe care am marcat-o în linkul de mai sus

Răspuns

Codul de mai jos (adaptat de la aici ) produce o ieșire similară cu funcția Image3D care din păcate este disponibil numai pentru Mathematica versiunea 9.

Unele date 3D aleatorii:

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

Aici specificăm domeniul de bin (-3, 3) și rezoluția de binning:

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

Codul real de produs cifra:

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

voxeli

Comentarii

  • votează în sus pentru tine 🙂
  • +1 pentru că este mult, mult mai rapid decât Răspunsul 1.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *