Wykres gęstości mapy cieplnej 3D

Mam zestaw danych, który wygląda następująco: {{x1, y1, z1}, {x2, y2, z2}, ...}, więc opisuje punkty w przestrzeni 3D . Chcę zrobić mapę cieplną z tych danych. Aby punkty o dużej gęstości były wyświetlane jako chmura i oznaczone różnymi kolorami w zależności od gęstości.

W rzeczywistości chcę, aby wynik tego skryptu był tylko dla 3D:

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

tutaj wprowadź opis obrazu

Komentarze

  • Witamy w Mathematica.SE!
  • Czy masz wersję 9? Następnie spójrz na Image3D
  • Dziękuję za odpowiedź, ale nie. użyj Mathematica 8
  • To świetny przykład !! dla mnie użyłem funkcji Image3D w mathematica 9, ale moim problemem jest to, jak mogę zmienić wymiary każdego woksela za pomocą funkcji Image3D [].
  • Powinieneś zadać inne pytanie, nie publikować swojego pytania jako odpowiedzi .

Odpowiedź

Jeśli chcesz wykreślić rozkład trójwymiarowy, najpierw musisz go utworzyć ! SmoothDensityHistogram wykreśla gładki histogram jądra wartości $ \ {x_i, y_i \} $, ale ponieważ mamy tutaj dane trójwymiarowe, potrzebujemy funkcji o nazwie SmoothKernelDistribution!

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

Teraz masz rozkład prawdopodobieństwa z trzema zmiennymi. Możemy więc po prostu wykreślić PDF jako trójwymiarowy wykres konturowy za pomocą ContourPlot3D. Pamiętaj, że ta funkcja jest podobno mało powolna.

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

tutaj wprowadź opis obrazu

Aby przeciąć kontury, użyłem opcji!

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

Aby sprawdzić, czy gęstość punktów danych jest odpowiedzialna za kształt kontury, których możemy użyć Graphics3D

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

tutaj wprowadź opis obrazu

BR

EDYTUJ

Do naśladowania na przykładzie 2D i uzyskaj ciepłe kolory dla wyższych gęstości

 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 matematyczna

Komentarze

  • Czy ' t używasz ListContourPlot3D, edytuj nieważne, wynik jest okropny.
  • Świetnie dziękuję, ten skrypt z edycją dokładnie działa! Jedna rzecz, jeśli połączę obraz punktu z wykresem konturowym, otrzymam następujące informacje: oi47.tinypic.com/34g7otd.jpg Oznaczyłem obszar, który jest wykluczony wykres konturowy, ale zawiera kilka punktów …
  • @ user1936577, rozważ użycie prostszej nazwy użytkownika;) Teraz musisz również zastosować to samo wykluczenie punktów, aby nie były wyświetlane wszystkie punkty. Możesz użyć Cases lub Select, aby wybrać odpowiednie punkty.
  • właśnie zmieniłem nazwę;) Ale chcę rozważenie wszystkich punktów w moim ContourPlot i teraz ' zastanawiam się nad tym obszarem, który zaznaczyłem w powyższym linku

Odpowiedź

Poniższy kod (zaadaptowany z tutaj ) generuje dane wyjściowe podobne do funkcji Image3D, który jest niestety dostępny tylko dla Mathematica w wersji 9.

Niektóre losowe dane 3D:

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

Tutaj określamy domenę do bin (-3, 3) i rozdzielczość binningu:

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

Rzeczywisty kod do wygenerowania rysunek:

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

woksele

Komentarze

  • zagłosuj za Ciebie 🙂
  • +1 za bycie dużo, dużo szybszym niż odpowiedź 1.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *