Jeg har nogle (diskrete) data af typen $ \ {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}}
og jeg ønsker at lave et 3D-histogram ud af dette med rektangler i højden $ z_i $ og firkantet base placeret i planet i position $ x_i, y_i $ . Dette plejede at være muligt ved hjælp af` `GeneralizedBarChart3D " men dette er blevet erstattet af RectangleChart3D, og jeg kan ikke få det til at fungere.
Det bedste jeg kan gøre lige nu er
ListPointPlot3D[data, Filling -> Bottom]
som producerer noget som
hvor punkterne er placeret korrekt og i den korrekte højde, men jeg vil have et rektangel (med en firkantet base med bredde 1) i den rigtige højde snarere end et punkt.
Enhver hjælp vil blive værdsat.
Kommentarer
Svar
Transformer data
i et WeightedData
objekt og brug det med Histogram3D
:
wd = WeightedData[data[[All, ;; 2]], data[[All, -1]]]; Histogram3D[wd, {1}, ColorFunction -> "Rainbow"]
Skift bin-specifikationen til {2}
:
Histogram3D[wd, {2}, ColorFunction -> "Rainbow"]
For at vise dataelementer med nul vægt skal du erstatte s i den tredje kolonne med data med et lille nummer (sig, 10^-6
):
wd2 = WeightedData[data[[All, ;; 2]], data[[All, -1]] /. 0 -> 10^-6]; Histogram3D[wd2, {1}, ColorFunction -> "Rainbow"]
Svar
Du har ikke et histogram, men virkelig et 3D-søjlediagram, da højderne ikke svarer til 1 eller en samlet prøvestørrelse. Men med dit specifikke datasæt, hvor alle kombinationer af værdier for hver dimension (gå fra 4 til 10 i trin på 2) er tilgængelige, kan man nemt bruge DiscretePlot3D
:
DiscretePlot3D[data[[4 (i/2 - 2) + j/2 - 1, 3]], {i, 4, 10, 2}, {j, 4, 10, 2}, ExtentSize -> Full, FillingStyle -> Opacity[1]]
En alternativ tilgang, der undgår " gymnastik ", du nævner, er at bruge et sparsomt array:
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]]
Kommentarer
- Dejligt. Du er nødt til at lave en hel del gymnastik for at skabe det rette format til plottet …
- Måske har du brug for mere motion. 😉
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]