3D-lämpökartan tiheyskaavio

Minulla on joukko tietoja, jotka näyttävät {{x1, y1, z1}, {x2, y2, z2}, ...}, joten se kuvaa pisteitä 3D-tilassa . Haluan tehdä lämpökartan näistä tiedoista. Joten suuren tiheyden pisteet näytetään pilvinä ja ne on merkitty eri väreillä riippuen tiheydestä.

Itse haluan tämän skriptin tuloksen vain 3D: lle:

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

kirjoita kuvan kuvaus tähän

kommentit

  • Tervetuloa Mathematica.SE-sivustoon!
  • Onko sinulla versio 9? Katso sitten Image3D
  • Kiitos vastauksesta, mutta en minä käytä Mathematica 8
  • Se on hieno esimerkki !! Minulle käytin mathica 9: n Image3D-toimintoa, mutta ongelmani on, kuinka voin muuttaa jokaisen vokselin mittasuhteita Image3D [] -toiminnon avulla.
  • Sinun tulee esittää toinen kysymys, älä postita kysymystäsi vastauksena .

vastaus

Jos haluat piirtää kolmiulotteisen jakelun, sinun on ensin muodostettava se ! SmoothDensityHistogram piirtää tasaisen ytimen histogrammin arvoista $ \ {x_i, y_i \} $, mutta koska meillä on kolmiulotteisia tietoja, tarvitsemme funktion nimeltä SmoothKernelDistribution!

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

Nyt olet saanut todennäköisyysjakauman kolmella muuttujalla. Joten voimme yksinkertaisesti piirtää PDF -kuvion 3D-käyränä käyttämällä ContourPlot3D. Muista, että tämän toiminnon pidetään olevan vähän hidas.

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

kirjoita kuvan kuvaus tähän

Leikkaamalla ääriviivoja käytin vaihtoehtoa!

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

Tarkistamaan, että datapisteiden tiheys on vastuussa ääriviivat, joita voimme käyttää Graphics3D

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

kirjoita kuvan kuvaus tähän

BR

MUOKKAA

Seuraa ylöspäin 2D-esimerkissä ja hanki lämpimät värit suuremmille tiheyksille

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

Kommentit

  • Et voi ' käyttää ListContourPlot3D, edit ei koskaan, tulos on kamala.
  • Hienoa, kiitos, että komentosarja muokkauksella tekee työn! Yksi asia, jos yhdistän pistekuvan ääriviivapiirrokseen, saan seuraavan: oi47.tinypic.com/34g7otd.jpg merkitsin alueen, jota ei ole ääriviiva, mutta sisältää joitain pisteitä …
  • @ user1936577 harkitse yksinkertaisemman käyttäjänimen käyttöä;) Nyt sinun on myös käytettävä samaa poissulkemista pisteissäsi, jotta kaikkia pisteitä ei näytetä. Voit valita merkitykselliset kohdat Cases tai Select avulla.
  • muutin juuri nimeä;) Mutta haluan ottaa huomioon kaikki ContourPlot-pisteeni ja nyt ' mietin tätä aluetta, jonka merkitsin yllä olevaan linkkiin.

Vastaa

Alla oleva koodi (mukautettu täältä ) tuottaa tuloksen, joka on samanlainen kuin funktio Image3D, joka on valitettavasti saatavilla vain Mathematica -versiolle 9.

Joitakin satunnaisia 3D-tietoja:

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

Tässä määritetään toimialue bin (-3, 3) ja yhdistämisen tarkkuus:

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

Todellinen tuotettava koodi luku:

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

vokselit

kommentit

  • äänestä sinua 🙂
  • +1, koska olet paljon, paljon nopeampi kuin vastaus 1.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *