Ik heb enkele (discrete) gegevens van het type $ \ {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}}
en ik “probeer hier een 3D-histogram van te maken, met rechthoeken van hoogte $ z_i $ en vierkante basis in het vlak op positie $ x_i, y_i $ . Vroeger was dit mogelijk met` `GeneralizedBarChart3D " maar dit is vervangen door RectangleChart3D en ik kan het niet laten werken.
Het beste wat ik nu kan doen is
ListPointPlot3D[data, Filling -> Bottom]
wat iets produceert als
waar de punten correct zijn geplaatst en op de juiste hoogte, maar ik wil een rechthoek (met een vierkante basis van breedte 1) met de juiste hoogte in plaats van een punt.
Alle hulp wordt op prijs gesteld.
Opmerkingen
Antwoord
Transformeer data
in een WeightedData
-object en gebruik het met Histogram3D
:
wd = WeightedData[data[[All, ;; 2]], data[[All, -1]]]; Histogram3D[wd, {1}, ColorFunction -> "Rainbow"]
Wijzig de bin-specificatie in {2}
:
Histogram3D[wd, {2}, ColorFunction -> "Rainbow"]
Om gegevenselementen met gewicht nul weer te geven, vervangt u s in de derde kolom met gegevens met een klein getal (zeg, 10^-6
):
wd2 = WeightedData[data[[All, ;; 2]], data[[All, -1]] /. 0 -> 10^-6]; Histogram3D[wd2, {1}, ColorFunction -> "Rainbow"]
Antwoord
Je hebt geen histogram maar echt een 3D-staafdiagram, aangezien de hoogten niet samen 1 of de totale steekproefomvang zijn. Maar met uw specifieke dataset waar alle combinaties van waarden voor elke dimensie (gaande van 4 tot 10 in stappen van 2) beschikbaar zijn, kan men gemakkelijk DiscretePlot3D
gebruiken:
DiscretePlot3D[data[[4 (i/2 - 2) + j/2 - 1, 3]], {i, 4, 10, 2}, {j, 4, 10, 2}, ExtentSize -> Full, FillingStyle -> Opacity[1]]
Een alternatieve benadering die de " gymnastiek " vermijdt die u noemt, is om een sparse array te gebruiken:
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]]
Reacties
- Leuk. Je moet nogal wat gymnastiek doen om het juiste formaat voor de plot te genereren …
- Misschien heb je meer beweging nodig. 😉
Histogram3D[Function[y, Table[{y[[1]], y[[2]]}, y[[3]]]] /@ (Function[x, {x[[1]], x[[2]], x[[3]]*10000}] /@ data)]
ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0]
ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0, PlotRange -> {{3, 11}, {3, 11}}, ColorFunction -> "SouthwestColors", Mesh -> None]