Histogram 3D z danych dyskretnych

Mam pewne (dyskretne) dane typu $ \ {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}} 

i ja „chcę zrobić z tego histogram 3D, z prostokątami o wysokości $ z_i $ i kwadratową podstawę znajdującą się w płaszczyźnie w pozycji $ x_i, y_i $ . Było to możliwe przy użyciu` `GeneralizedBarChart3D ", ale zostało to zastąpione przez RectangleChart3D i nie mogę tego zrobić.

Najlepsze, co mogę teraz zrobić, to

ListPointPlot3D[data, Filling -> Bottom] 

co daje coś takiego jak

tutaj wprowadź opis obrazu

gdzie punkty są poprawnie zlokalizowane i na odpowiedniej wysokości, ale chcę mieć prostokąt (z kwadratową podstawą o szerokości 1) o prawidłowej wysokości, a nie punkt.

Każda pomoc byłaby mile widziana.

Komentarze

  • Histogram3D[Function[y, Table[{y[[1]], y[[2]]}, y[[3]]]] /@ (Function[x, {x[[1]], x[[2]], x[[3]]*10000}] /@ data)]
  • Możesz użyć ListPlot3D z porządkiem interpolacji 0: ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0]
  • Aby uwzględnić punkt danych {4, 4, 0.6570}, dodaję punkt {4,4} 0,6570 * 10000 = 6570 razy (do tymczasowej tablicy). Powtórz to dla wszystkich punktów, a następnie wykreśl histogram (3D) tej tymczasowej tablicy (zawierającej {4,4} powtórzone 6570 razy).
  • Opierając się na @Carl ' s komentarz ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0, PlotRange -> {{3, 11}, {3, 11}}, ColorFunction -> "SouthwestColors", Mesh -> None]
  • @HarshalGajjar Dzięki … W jakiś sposób funkcjonalność " GeneralizedBarChart3D " tak naprawdę nie został zastąpiony.

Odpowiedź

Przekształć data do obiektu WeightedData i używaj go z Histogram3D :

wd = WeightedData[data[[All, ;; 2]], data[[All, -1]]]; Histogram3D[wd, {1}, ColorFunction -> "Rainbow"] 

tutaj wprowadź opis obrazu

Zmień specyfikację bin na {2}:

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

tutaj wprowadź opis obrazu

Aby wyświetlić elementy danych o zerowej wadze, zamień sw trzeciej kolumnie danych z małą liczbą (powiedzmy 10^-6):

wd2 = WeightedData[data[[All, ;; 2]], data[[All, -1]] /. 0 -> 10^-6]; Histogram3D[wd2, {1}, ColorFunction -> "Rainbow"] 

tutaj wprowadź opis obrazu

Odpowiedź

Nie masz histogramu, ale tak naprawdę wykres słupkowy 3D, ponieważ wysokości nie sumują się do 1 ani całkowitej wielkości próbki. Jednak w przypadku konkretnego zbioru danych, w którym dostępne są wszystkie kombinacje wartości dla każdego wymiaru (od 4 do 10 w krokach co 2), można łatwo użyć DiscretePlot3D:

DiscretePlot3D[data[[4 (i/2 - 2) + j/2 - 1, 3]], {i, 4, 10, 2}, {j, 4, 10, 2}, ExtentSize -> Full, FillingStyle -> Opacity[1]] 

Wykres słupkowy 3D

Alternatywnym podejściem, które pozwala uniknąć " gimnastyki ", o której wspomniałeś, jest użycie rzadkiej tablicy:

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

Alternatywne podejście do wykresu słupkowego 3D z rzadką tablicą

Komentarze

  • Świetnie. Musisz trochę poćwiczyć, aby wygenerować właściwy format fabuły …
  • Może potrzebujesz więcej ćwiczeń. 😉

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *