Ich habe einige (diskrete) Daten vom Typ $ \ {x_i, y_i, z_i \} $
data={{4, 4, 0.6570}, {6, 4, 0.8240}, {8, 4, 0.8930}, {10, 4, 0.9330},{4,6, 0.2780}, {6,6,0.5660}, {8, 6, 0.7460}, {10, 6, 0.8320}, {4, 8,0}, {6, 8, 0.2620}, {8, 8, 0.5100}, {10, 8, 0.6100}, {4,10, 0}, {6,10, 0.04900}, {8, 10, 0.2370}, {10, 10, 0.3940}}
und ich möchte daraus ein 3D-Histogramm mit Rechtecken der Höhe $ z_i $ und quadratische Basis in der Ebene an Position $ x_i, y_i $ . Dies war früher mit` `GeneralizedBarChart3D möglich " aber dies wurde durch RectangleChart3D ersetzt und ich kann es nicht zum Laufen bringen.
Das Beste, was ich jetzt tun kann, ist
ListPointPlot3D[data, Filling -> Bottom]
erzeugt so etwas wie
wo die Punkte korrekt positioniert sind und sich auf der richtigen Höhe befinden, aber ich möchte ein Rechteck (mit einer quadratischen Basis der Breite 1) mit der richtigen Höhe anstelle eines Punktes.
Jede Hilfe wäre willkommen.
Kommentare
-
Histogram3D[Function[y, Table[{y[[1]], y[[2]]}, y[[3]]]] /@ (Function[x, {x[[1]], x[[2]], x[[3]]*10000}] /@ data)]
- Sie können ListPlot3D mit einer Interpolationsreihenfolge von 0 verwenden:
ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0]
- Um den Datenpunkt {4, 4, 0,6570} zu berücksichtigen, füge ich den Punkt {4,4} 0,6570 * 10000 = 6570 mal hinzu (in ein temporäres Array). Wiederholen Sie dies für alle Punkte und zeichnen Sie dann das Histogramm (3D) dieses temporären Arrays (das {4,4} enthält, das 6570 Mal wiederholt wurde).
- Aufbauend auf @Carl ' s Kommentar
ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0, PlotRange -> {{3, 11}, {3, 11}}, ColorFunction -> "SouthwestColors", Mesh -> None]
- @HarshalGajjar Danke … Irgendwie die Funktionalität " GeneralizedBarChart3D " wurde nicht wirklich ersetzt.
Antwort
Transformieren Sie data
in ein WeightedData
Objekt und verwenden Sie es mit Histogram3D
:
wd = WeightedData[data[[All, ;; 2]], data[[All, -1]]]; Histogram3D[wd, {1}, ColorFunction -> "Rainbow"]
Ändern Sie die Bin-Spezifikation in {2}
:
Histogram3D[wd, {2}, ColorFunction -> "Rainbow"]
Um Datenelemente mit einer Gewichtung von Null anzuzeigen, ersetzen Sie s in der dritten Datenspalte mit einer kleinen Nummer (z. B. 10^-6
):
wd2 = WeightedData[data[[All, ;; 2]], data[[All, -1]] /. 0 -> 10^-6]; Histogram3D[wd2, {1}, ColorFunction -> "Rainbow"]
Antwort
Sie haben kein Histogramm, sondern ein 3D-Balkendiagramm, da die Höhen nicht 1 oder eine Gesamtstichprobengröße ergeben. Mit Ihrem speziellen Datensatz, in dem alle Wertekombinationen für jede Dimension (von 4 bis 10 in Schritten von 2) verfügbar sind, können Sie jedoch problemlos DiscretePlot3D
:
DiscretePlot3D[data[[4 (i/2 - 2) + j/2 - 1, 3]], {i, 4, 10, 2}, {j, 4, 10, 2}, ExtentSize -> Full, FillingStyle -> Opacity[1]]
Ein alternativer Ansatz, der die " Gymnastik ", die Sie erwähnen, vermeidet, ist die Verwendung eines spärlichen Arrays:
data = {{4, 4, 0.6570}, {6, 4, 0.8240}, {8, 4, 0.8930}, {10, 4, 0.9330}, {4, 6, 0.2780}, {6, 6, 0.5660}, {8, 6, 0.7460}, {10, 6, 0.8320}, {4, 8, 0}, {6, 8, 0.2620}, {8, 8, 0.5100}, {10, 8, 0.6100}, {4, 10, 0}, {6, 10, 0.04900}, {8, 10, 0.2370}, {10, 10, 0.3940}} sa = SparseArray[{#[[1]], #[[2]]} -> #[[3]] & /@ data] DiscretePlot3D[sa[[i, j]], {i, 4, 10, 2}, {j, 4, 10, 2}, ExtentSize -> Full, FillingStyle -> Opacity[1]]
Kommentare
- Schön. Sie müssen ziemlich viel turnen, um das richtige Format für die Handlung zu generieren …
- Vielleicht brauchen Sie mehr Bewegung. 😉