3D-Histogramm aus diskreten Daten

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

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein.

Ändern Sie die Bin-Spezifikation in {2}:

Histogram3D[wd, {2}, ColorFunction -> "Rainbow"] 

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein.

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

3D-Balkendiagramm

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

Alternativer Ansatz für 3D-Balkendiagramme mit einem spärlichen Array

Kommentare

  • Schön. Sie müssen ziemlich viel turnen, um das richtige Format für die Handlung zu generieren …
  • Vielleicht brauchen Sie mehr Bewegung. 😉

Schreibe einen Kommentar

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