Istogramma 3D da dati discreti

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

inserisci qui la descrizione dellimmagine

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

  • Histogram3D[Function[y, Table[{y[[1]], y[[2]]}, y[[3]]]] /@ (Function[x, {x[[1]], x[[2]], x[[3]]*10000}] /@ data)]
  • Puoi utilizzare ListPlot3D con un ordine di interpolazione 0: ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0]
  • Per tenere conto del punto dati {4, 4, 0.6570}, aggiungo il punto {4,4} 0.6570 * 10000 = 6570 volte (in un array temporaneo). Ripeti loperazione per tutti i punti e poi traccia listogramma (3D) di questo array temporaneo (contenente {4,4} ripetuto 6570 volte).
  • Costruire su @Carl ' s comment ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0, PlotRange -> {{3, 11}, {3, 11}}, ColorFunction -> "SouthwestColors", Mesh -> None]
  • @HarshalGajjar Grazie … In qualche modo la funzionalità " GeneralizedBarChart3D " non è stato realmente sostituito.

Risposta

Trasforma data in un oggetto WeightedData e usalo con Histogram3D :

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

inserisci qui la descrizione dellimmagine

Modifica la specifica del contenitore in {2}:

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

inserisci qui la descrizione dellimmagine

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

inserisci qui la descrizione dellimmagine

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

Grafico a barre 3D

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

Approccio alternativo del grafico a barre 3D con una matrice sparsa

Commenti

  • Bello. Devi fare un po di ginnastica per generare il formato corretto per la trama …
  • Forse hai bisogno di più esercizio. 😉

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *