3D-Heatmap-Dichtediagramm

Ich habe einen Datensatz, der wie {{x1, y1, z1}, {x2, y2, z2}, ...} aussieht, sodass er Punkte im 3D-Raum beschreibt . Ich möchte aus diesen Daten eine Heatmap erstellen. Damit Punkte mit einer hohen Dichte als Wolke angezeigt und abhängig von der Dichte mit unterschiedlichen Farben markiert werden.

Tatsächlich möchte ich das Ergebnis dieses Skripts nur für 3D:

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

hier Bildbeschreibung eingeben

Kommentare

  • Willkommen bei Mathematica.SE!
  • Haben Sie Version 9? Dann schauen Sie sich Image3D an …
  • Vielen Dank für die Antwort, aber nein, ich benutze Mathematica 8
  • Es ist ein großartiges Beispiel !! Für mich habe ich die Image3D-Funktion von mathematica 9 verwendet, aber mein Problem ist, wie ich die Abmessungen jedes Voxels mit der Image3D [] -Funktion ändern kann.
  • Sie sollten eine andere Frage stellen und Ihre Frage nicht als Antwort posten .

Antwort

Wenn Sie eine dreidimensionale Verteilung zeichnen möchten, müssen Sie sie zuerst bilden ! SmoothDensityHistogram zeichnet ein glattes Kernelhistogramm der Werte $ \ {x_i, y_i \} $, aber da wir hier dreidimensionale Daten haben, benötigen wir die Funktion SmoothKernelDistribution!

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

Jetzt haben Sie die Wahrscheinlichkeitsverteilung mit drei Variablen. Wir können also einfach das PDF als 3D-Konturdiagramm mit ContourPlot3D zeichnen. Beachten Sie, dass diese Funktion angeblich etwas langsam ist.

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

Geben Sie hier die Bildbeschreibung ein

Um die Konturen zu durchschneiden, habe ich die Option verwendet!

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

Um zu überprüfen, ob die Datenpunktdichte für die Form der verantwortlich ist Konturen, die wir verwenden können Graphics3D

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

Geben Sie hier die Bildbeschreibung ein

BR

BEARBEITEN

Folgen Sehen Sie sich das 2D-Beispiel an und erhalten Sie warme Farben für höhere Dichten.

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

Kommentare

  • Kann ' nicht verwendet werden ListContourPlot3D, edit egal, das Ergebnis ist schrecklich.
  • Großartig, danke, dass das Skript mit der Bearbeitung genau die Arbeit macht! Eine Sache, wenn ich das Punktbild mit dem Konturdiagramm kombiniere, erhalte ich Folgendes: oi47.tinypic.com/34g7otd.jpg Ich habe den Bereich markiert, von dem ausgeschlossen ist Das Konturdiagramm enthält jedoch einige Punkte …
  • @ user1936577 Bitte verwenden Sie einen einfacheren Benutzernamen;) Jetzt müssen Sie auch denselben Ausschluss für Ihre Punkte verwenden, damit nicht alle Punkte angezeigt werden. Sie können Cases oder Select verwenden, um die relevanten Punkte auszuwählen.
  • hat gerade den Namen geändert;) Aber ich möchte Um alle Punkte in meinem ContourPlot zu berücksichtigen, frage ich mich jetzt ' über diesen Bereich, den ich im obigen Link markiert habe.

Antwort

Der folgende Code (angepasst von hier ) erzeugt eine Ausgabe, die der Funktion Image3D, das leider nur für Mathematica Version 9 verfügbar ist.

Einige zufällige 3D-Daten:

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

Hier geben wir die Domäne für bin (-3, 3) und die Binning-Auflösung an:

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

Der tatsächlich zu erzeugende Code die Abbildung:

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

Voxel

Kommentare

  • Upvote für Sie 🙂
  • +1 für viel, viel schneller als Antwort 1.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.