3D-histogram van discrete gegevens

Ik heb enkele (discrete) gegevens van het type $ \ {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}} 

en ik “probeer hier een 3D-histogram van te maken, met rechthoeken van hoogte $ z_i $ en vierkante basis in het vlak op positie $ x_i, y_i $ . Vroeger was dit mogelijk met` `GeneralizedBarChart3D " maar dit is vervangen door RectangleChart3D en ik kan het niet laten werken.

Het beste wat ik nu kan doen is

ListPointPlot3D[data, Filling -> Bottom] 

wat iets produceert als

voer hier de afbeeldingsbeschrijving in

waar de punten correct zijn geplaatst en op de juiste hoogte, maar ik wil een rechthoek (met een vierkante basis van breedte 1) met de juiste hoogte in plaats van een punt.

Alle hulp wordt op prijs gesteld.

Opmerkingen

  • Histogram3D[Function[y, Table[{y[[1]], y[[2]]}, y[[3]]]] /@ (Function[x, {x[[1]], x[[2]], x[[3]]*10000}] /@ data)]
  • Je zou ListPlot3D kunnen gebruiken met een 0 interpolatie volgorde: ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0]
  • Om rekening te houden met het datapunt {4, 4, 0.6570}, voeg ik het punt {4,4} 0.6570 * 10000 = 6570 keer toe (in een tijdelijke array). Herhaal dit voor alle punten en plot dan het histogram (3D) van deze tijdelijke array (met {4,4} 6570 keer herhaald).
  • Voortbouwend op @Carl ' s commentaar ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0, PlotRange -> {{3, 11}, {3, 11}}, ColorFunction -> "SouthwestColors", Mesh -> None]
  • @HarshalGajjar Bedankt … Op de een of andere manier is de functionaliteit " GeneralizedBarChart3D " is niet echt vervangen.

Antwoord

Transformeer data in een WeightedData -object en gebruik het met Histogram3D :

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

voer de beschrijving van de afbeelding hier in

Wijzig de bin-specificatie in {2}:

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

voer hier een afbeeldingsbeschrijving in

Om gegevenselementen met gewicht nul weer te geven, vervangt u s in de derde kolom met gegevens met een klein getal (zeg, 10^-6):

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

voer hier een afbeeldingsbeschrijving in

Antwoord

Je hebt geen histogram maar echt een 3D-staafdiagram, aangezien de hoogten niet samen 1 of de totale steekproefomvang zijn. Maar met uw specifieke dataset waar alle combinaties van waarden voor elke dimensie (gaande van 4 tot 10 in stappen van 2) beschikbaar zijn, kan men gemakkelijk DiscretePlot3D gebruiken:

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

3D-staafdiagram

Een alternatieve benadering die de " gymnastiek " vermijdt die u noemt, is om een sparse array te gebruiken:

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-staafdiagram alternatieve benadering met een beperkte array

Reacties

  • Leuk. Je moet nogal wat gymnastiek doen om het juiste formaat voor de plot te genereren …
  • Misschien heb je meer beweging nodig. 😉

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *