Ho alcuni dati (discreti) del tipo $ \ {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}}
e io “sto cercando di ricavare un istogramma 3D da questo, con rettangoli di altezza $ z_i $ e base quadrata situata nel piano nella posizione $ x_i, y_i $ . Questo era possibile utilizzando` `GeneralizedBarChart3D " ma questo è stato sostituito da RectangleChart3D e non posso “farlo funzionare.
Il meglio che posso fare adesso è
ListPointPlot3D[data, Filling -> Bottom]
che produce qualcosa di simile
dove i punti sono posizionati correttamente e allaltezza corretta, ma voglio avere un rettangolo (con una base quadrata di larghezza 1) dellaltezza corretta piuttosto che un punto.
Qualsiasi aiuto sarebbe apprezzato.
Commenti
Risposta
Trasforma data
in un oggetto WeightedData
e usalo con Histogram3D
:
wd = WeightedData[data[[All, ;; 2]], data[[All, -1]]]; Histogram3D[wd, {1}, ColorFunction -> "Rainbow"]
Modifica la specifica del contenitore in {2}
:
Histogram3D[wd, {2}, ColorFunction -> "Rainbow"]
Per mostrare elementi di dati con peso zero, sostituire nella terza colonna di dati con un numero piccolo (ad esempio, 10^-6
):
wd2 = WeightedData[data[[All, ;; 2]], data[[All, -1]] /. 0 -> 10^-6]; Histogram3D[wd2, {1}, ColorFunction -> "Rainbow"]
Risposta
Non hai un istogramma ma in realtà un grafico a barre 3D poiché le altezze non si sommano a 1 o alla dimensione totale del campione. Ma con il tuo particolare set di dati in cui sono disponibili tutte le combinazioni di valori per ciascuna dimensione (da 4 a 10 in passaggi di 2), puoi facilmente utilizzare DiscretePlot3D
:
DiscretePlot3D[data[[4 (i/2 - 2) + j/2 - 1, 3]], {i, 4, 10, 2}, {j, 4, 10, 2}, ExtentSize -> Full, FillingStyle -> Opacity[1]]
Un approccio alternativo che evita la " ginnastica " di cui hai parlato è usare un array sparse:
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]]
Commenti
- Bello. Devi fare un po di ginnastica per generare il formato corretto per la trama …
- Forse hai bisogno di più esercizio. 😉
Histogram3D[Function[y, Table[{y[[1]], y[[2]]}, y[[3]]]] /@ (Function[x, {x[[1]], x[[2]], x[[3]]*10000}] /@ data)]
ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0]
ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0, PlotRange -> {{3, 11}, {3, 11}}, ColorFunction -> "SouthwestColors", Mesh -> None]