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]
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}]
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]
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]]
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
oderSelect
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"]
Kommentare
- Upvote für Sie 🙂
- +1 für viel, viel schneller als Antwort 1.