3D-histogram från diskreta data

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

ange bildbeskrivning här

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

  • Histogram3D[Function[y, Table[{y[[1]], y[[2]]}, y[[3]]]] /@ (Function[x, {x[[1]], x[[2]], x[[3]]*10000}] /@ data)]
  • Du kan använda ListPlot3D med en interpoleringsordning 0: ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0]
  • För att redovisa datapunkten {4, 4, 0.6570} lägger jag till punkten {4,4} 0,6570 * 10000 = 6570 gånger (i en tillfällig matris). Upprepa detta för alla punkter och plottra sedan histogrammet (3D) för den här tillfälliga matrisen (som innehåller {4,4} upprepas 6570 gånger).
  • Bygga på @Carl ' s kommentar ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0, PlotRange -> {{3, 11}, {3, 11}}, ColorFunction -> "SouthwestColors", Mesh -> None]
  • @HarshalGajjar Tack … På något sätt har funktionaliteten " GeneralizedBarChart3D " ersattes inte riktigt.

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

ange bildbeskrivning här

Ändra pappersspecifikationen till {2}:

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

ange bildbeskrivning här

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

ange bildbeskrivning här

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

3D stapeldiagram

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

Alternativt 3D-stapeldiagram med en gles array

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. 😉

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *