3D-histogram fra diskrete data (Norsk)

Jeg har noen (diskrete) 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}} 

og jeg ønsker å lage et 3D-histogram ut av dette, med rektangler i høyden $ z_i $ og kvadratisk base plassert i planet i posisjon $ x_i, y_i $ . Dette pleide å være mulig å bruke` `GeneralizedBarChart3D " men dette er erstattet av RectangleChart3D, og jeg kan ikke få det til å fungere.

Det beste jeg kan gjøre akkurat nå er

ListPointPlot3D[data, Filling -> Bottom] 

som produserer noe sånt som

skriv inn bildebeskrivelse her

der punktene er riktig plassert og i riktig høyde, men jeg vil ha et rektangel (med en kvadratisk base med bredde 1) av riktig høyde i stedet for et punkt.

Enhver hjelp vil bli verdsatt.

Kommentarer

  • Histogram3D[Function[y, Table[{y[[1]], y[[2]]}, y[[3]]]] /@ (Function[x, {x[[1]], x[[2]], x[[3]]*10000}] /@ data)]
  • Du kan bruke ListPlot3D med en 0 interpolasjonsrekkefølge: ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0]
  • For å gjøre rede for datapunktet {4, 4, 0.6570}, legger jeg til punktet {4,4} 0,6570 * 10000 = 6570 ganger (i en midlertidig matrise). Gjenta dette for alle punkter, og plott deretter histogrammet (3D) for denne midlertidige matrisen (som inneholder {4,4} gjentatt 6570 ganger).
  • Bygger på @Carl ' s kommentar ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0, PlotRange -> {{3, 11}, {3, 11}}, ColorFunction -> "SouthwestColors", Mesh -> None]
  • @HarshalGajjar Takk … På en eller annen måte har funksjonaliteten " GeneralizedBarChart3D " ble egentlig ikke erstattet.

Svar

Transform data i et WeightedData objekt og bruk det med Histogram3D :

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

skriv inn bildebeskrivelse her

Endre søppelspesifikasjonen til {2}:

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

skriv inn bildebeskrivelse her

For å vise dataelementer uten vekt, erstatt s i den tredje kolonnen med data med et lite nummer (si 10^-6):

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

skriv inn bildebeskrivelse her

Svar

Du har ikke et histogram, men egentlig et 3D-søylediagram, da høydene ikke tilsvarer 1 eller en total prøvestørrelse. Men med ditt spesifikke datasett der alle verdikombinasjoner for hver dimensjon (går fra 4 til 10 i trinn på 2) er tilgjengelige, kan man enkelt bruke DiscretePlot3D:

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

3D søylediagram

En alternativ tilnærming som unngår " gymnastikk " du nevner, er å bruke en sparsom matrise:

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

3D bar plot alternativ tilnærming med en sparsom matrise

Kommentarer

  • Hyggelig. Du må gjøre ganske mye gymnastikk for å generere riktig format for handlingen …
  • Kanskje du trenger mer trening. 😉

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *