Jag har några (diskreta) data av 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}}
och jag vill skapa ett 3D-histogram av detta, med rektanglar på höjden $ z_i $ och kvadratisk bas placerad i planet vid position $ x_i, y_i $ . Detta brukade vara möjligt med` `GeneralizedBarChart3D " men detta har ersatts av RectangleChart3D och jag kan inte få det att fungera.
Det bästa jag kan göra just nu är
ListPointPlot3D[data, Filling -> Bottom]
som producerar något som
där punkterna är korrekt placerade och i rätt höjd, men jag vill ha en rektangel (med en kvadratbas av bredd 1) med rätt höjd snarare än en punkt.
All hjälp skulle uppskattas.
Kommentarer
Svar
Transform data
till ett WeightedData
objekt och använda det med Histogram3D
:
wd = WeightedData[data[[All, ;; 2]], data[[All, -1]]]; Histogram3D[wd, {1}, ColorFunction -> "Rainbow"]
Ändra pappersspecifikationen till {2}
:
Histogram3D[wd, {2}, ColorFunction -> "Rainbow"]
För att visa dataelement med nollvikt, ersätt s i den tredje kolumnen med data med ett litet nummer (säg 10^-6
):
wd2 = WeightedData[data[[All, ;; 2]], data[[All, -1]] /. 0 -> 10^-6]; Histogram3D[wd2, {1}, ColorFunction -> "Rainbow"]
Svar
Du har inte ett histogram men egentligen ett 3D-stapeldiagram eftersom höjderna inte uppgår till 1 eller en total provstorlek. Men med din specifika dataset där alla kombinationer av värden för varje dimension (går från 4 till 10 i steg om 2) är tillgängliga, kan man enkelt använda DiscretePlot3D
:
DiscretePlot3D[data[[4 (i/2 - 2) + j/2 - 1, 3]], {i, 4, 10, 2}, {j, 4, 10, 2}, ExtentSize -> Full, FillingStyle -> Opacity[1]]
Ett alternativt tillvägagångssätt som undviker " gymnastik " du nämner är att använda en gles 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
- Trevligt. Du måste göra en hel del gymnastik för att skapa rätt format för handlingen …
- Kanske behöver du mer träning. 😉
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]