Histogramă 3D din date discrete

Am câteva date (discrete) de tipul $ \ {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 caut să fac o histogramă 3D din aceasta, cu dreptunghiuri de înălțime $ z_i $ și baza pătrată situată în plan la poziția $ x_i, y_i $ . Acest lucru era posibil folosind` `GeneralizedBarChart3D " dar acest lucru a fost înlocuit cu RectangleChart3D și nu pot face ca acesta să funcționeze.

Cel mai bun lucru pe care îl pot face acum este

ListPointPlot3D[data, Filling -> Bottom] 

care produce ceva de genul

introduceți descrierea imaginii aici

unde punctele sunt corect localizate și la înălțimea corectă, dar vreau să am un dreptunghi (cu o bază pătrată de lățime 1) de înălțimea corectă, mai degrabă decât un punct.

Orice ajutor ar fi apreciat.

Comentarii

  • Histogram3D[Function[y, Table[{y[[1]], y[[2]]}, y[[3]]]] /@ (Function[x, {x[[1]], x[[2]], x[[3]]*10000}] /@ data)]
  • Puteți utiliza ListPlot3D cu o ordine de interpolare 0: ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0]
  • Pentru a ține cont de punctul de date {4, 4, 0,6570}, adaug punctul {4,4} 0,6570 * 10000 = 6570 ori (într-o matrice temporară). Repetați acest lucru pentru toate punctele și apoi trageți histograma (3D) a acestei matrice temporare (care conține {4,4} repetate de 6570 de ori).
  • Construind pe @Carl ' s comentariu ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0, PlotRange -> {{3, 11}, {3, 11}}, ColorFunction -> "SouthwestColors", Mesh -> None]
  • @HarshalGajjar Mulțumesc … Cumva funcționalitatea " GeneralizedBarChart3D " nu a fost într-adevăr înlocuit.

Răspuns

Transformare data într-un obiect WeightedData și utilizați-l cu Histogram3D :

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

introduceți descrierea imaginii aici

Schimbați specificația coșului în {2}:

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

introduceți descrierea imaginii aici

Pentru a afișa elemente de date cu greutate zero, înlocuiți s în a treia coloană de date cu un număr mic (să zicem, 10^-6):

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

introduceți descrierea imaginii aici

Răspuns

Nu aveți o histogramă, dar într-adevăr o diagramă cu bare 3D, deoarece înălțimile nu sunt însumate la 1 sau la o dimensiune totală a eșantionului. Dar, cu setul dvs. de date special, în care sunt disponibile toate combinațiile de valori pentru fiecare dimensiune (de la 4 la 10 în pași de 2), puteți utiliza cu ușurință DiscretePlot3D:

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

diagramă cu bare 3D

O abordare alternativă care evită " gimnastică " pe care o menționați este să utilizați un tablou rar:

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

Abordare alternativă a graficului 3D cu un tablou rar

Comentarii

  • Frumos. Trebuie să faceți destul de multă gimnastică pentru a genera formatul corect pentru complot …
  • Poate că aveți nevoie de mai mult exercițiu. 😉

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *