Histograma 3D de datos discretos

Tengo algunos datos (discretos) 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}} 

y «estoy buscando hacer un histograma 3D a partir de esto, con rectángulos de altura $ z_i $ y base cuadrada ubicada en el plano en la posición $ x_i, y_i $ . Esto solía ser posible usando` `GeneralizedBarChart3D " pero esto ha sido reemplazado por RectangleChart3D y no puedo hacerlo funcionar.

Lo mejor que puedo hacer ahora es

ListPointPlot3D[data, Filling -> Bottom] 

que produce algo como

ingrese la descripción de la imagen aquí

donde los puntos están ubicados correctamente y a la altura correcta, pero quiero tener un rectángulo (con una base cuadrada de ancho 1) de la altura correcta en lugar de un punto.

Se agradecería cualquier ayuda.

Comentarios

  • Histogram3D[Function[y, Table[{y[[1]], y[[2]]}, y[[3]]]] /@ (Function[x, {x[[1]], x[[2]], x[[3]]*10000}] /@ data)]
  • Puede usar ListPlot3D con un orden de interpolación 0: ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0]
  • Para tener en cuenta el punto de datos {4, 4, 0.6570}, agrego el punto {4,4} 0.6570 * 10000 = 6570 veces (en una matriz temporal). Repita esto para todos los puntos y luego trace el histograma (3D) de esta matriz temporal (que contiene {4,4} repetida 6570 veces).
  • Basándose en @Carl ' s comentario ListPlot3D[data, Filling -> Bottom, InterpolationOrder -> 0, PlotRange -> {{3, 11}, {3, 11}}, ColorFunction -> "SouthwestColors", Mesh -> None]
  • @HarshalGajjar Gracias … De alguna manera la funcionalidad " GeneralizedBarChart3D " no fue realmente reemplazado.

Respuesta

Transform data en un objeto WeightedData y utilícelo con Histogram3D :

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

ingrese la descripción de la imagen aquí

Cambie la especificación del contenedor a {2}:

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

ingrese la descripción de la imagen aquí

Para mostrar elementos de datos con peso cero, reemplace s en la tercera columna de datos con un número pequeño (digamos, 10^-6):

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

ingrese la descripción de la imagen aquí

Respuesta

No tiene un histograma, sino un gráfico de barras 3D, ya que las alturas no suman 1 o el tamaño total de la muestra. Pero con su conjunto de datos particular donde todas las combinaciones de valores para cada dimensión (pasando de 4 a 10 en pasos de 2) están disponibles, uno puede usar fácilmente DiscretePlot3D:

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

gráfico de barras 3D

Un enfoque alternativo que evita la " gimnasia " que mencionas es usar una matriz dispersa:

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

Enfoque alternativo de gráfico de barras 3D con una matriz dispersa

Comentarios

  • Agradable. Tienes que hacer bastante gimnasia para generar el formato adecuado para la trama …
  • Tal vez necesites más ejercicio. 😉

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *