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]
kommentit
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}]
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]
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]]
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
taiSelect
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"]
kommentit
- äänestä sinua 🙂
- +1, koska olet paljon, paljon nopeampi kuin vastaus 1.
Image3D
…