Gráfica de densidad de mapa de calor 3D

Tengo un conjunto de datos que se parece a {{x1, y1, z1}, {x2, y2, z2}, ...}, por lo que describe puntos en el espacio 3D . Quiero hacer un mapa de calor con estos datos. Para que los puntos con una alta densidad se muestren como una nube y se marquen con diferentes colores dependiendo de la densidad.

De hecho, quiero el resultado de este script solo para 3D:

data = RandomReal[1, {100, 2}]; SmoothDensityHistogram[data, 0.02, "PDF", ColorFunction -> "Rainbow", Mesh -> 0] 

ingrese la descripción de la imagen aquí

Comentarios

  • ¡Bienvenido a Mathematica.SE!
  • ¿Tiene la versión 9? Entonces eche un vistazo a Image3D
  • Gracias por la respuesta, pero no, yo usa Mathematica 8
  • ¡¡Es un gran ejemplo !! para mí utilicé la función Image3D de mathica 9, pero mi problema es cómo puedo cambiar las dimensiones de cada vóxel usando la función Image3D [].
  • Deberías hacer una pregunta diferente, no publicar tu pregunta como respuesta .

Respuesta

Si desea trazar una distribución que sea tridimensional, primero debe formarla ! SmoothDensityHistogram traza un histograma de kernel suave de los valores $ \ {x_i, y_i \} $ pero como tenemos datos tridimensionales aquí, necesitamos la función llamada SmoothKernelDistribution!

data = RandomReal[1, {1000, 3}]; dist = SmoothKernelDistribution[data]; 

Ahora tienes la distribución de probabilidad con tres variables. Así que simplemente podemos trazar PDF como un trazado de contorno en 3D usando ContourPlot3D. Tenga en cuenta que esta función tiene fama de ser un poco lenta.

ContourPlot3D[Evaluate@PDF[dist, {x, y, z}], {x, -2, 2}, {y, -2, 2}, {z, -2, 2}, PlotRange -> All, Mesh -> None, MaxRecursion -> 0, PlotPoints -> 160, ContourStyle -> Opacity[0.45], Mesh -> None, ColorFunction -> Function[{x, y, z, f}, ColorData["Rainbow"][z]], AxesLabel -> {x, y, z}] 

ingrese la descripción de la imagen aquí

¡Para cortar los contornos utilicé la opción!

RegionFunction -> Function[{x, y, z}, x < z || z > y] 

Para comprobar que la densidad de puntos de datos es responsable de la forma de la contornos podemos usar Graphics3D

pic = Graphics3D[{ColorData["DarkRainbow"][#[[3]]], PointSize -> Large, Point[#]} & /@ data, Boxed -> False]; Show[con, pic] 

ingrese la descripción de la imagen aquí

BR

EDIT

Para seguir en el ejemplo 2D y obtener colores cálidos para densidades más altas

 data = RandomReal[1, {500, 3}]; dist = SmoothKernelDistribution[data]; ContourPlot3D[Evaluate@PDF[dist, {x, y, z}], {x, -2, 2}, {y, -2, 2}, {z, -2, 2},PlotRange -> All, Mesh -> None, MaxRecursion -> 0, PlotPoints -> 150, ContourStyle -> Opacity[0.45], Contours -> 5, Mesh -> None, ColorFunction -> Function[{x, y, z, f}, ColorData["Rainbow"][f/Max[data]]], AxesLabel -> {x, y, z}, RegionFunction -> Function[{x, y, z}, x < z || z > y]] 

Gráficos de Mathematica

Comentarios

  • ¿Puedes ' t usas ListContourPlot3D, editar no importa, el resultado es horrible.
  • Muy gracias, ¡ese script con la edición hace exactamente el trabajo! Una cosa si combino la imagen del punto con el gráfico de contorno obtengo lo siguiente: oi47.tinypic.com/34g7otd.jpg Marqué el área que está excluida la gráfica de contorno pero contiene algunos puntos …
  • @ user1936577 por favor considere usar un nombre de usuario más simple;) Ahora también necesita usar la misma exclusión en sus puntos para que no se muestren todos los puntos. Puedes usar Cases o Select para elegir los puntos relevantes.
  • acabo de cambiar el nombre;) Pero quiero para considerar todos los puntos en mi ContourPlot y ahora ' me pregunto acerca de esta área que marqué en el enlace anterior

Responder

El siguiente código (adaptado de aquí ) produce una salida similar a la función Image3D que, lamentablemente, solo está disponible para Mathematica versión 9.

Algunos datos 3D aleatorios:

data = RandomReal[{-3, 3}, {5000, 3}]; 

Aquí especificamos el dominio a bin (-3, 3) y la resolución de binning:

binning = {-3, 3, .5}; 

El código real para producir la figura:

binned = BinCounts[data, binning, binning, binning]; dims = Dimensions@binned; normbinned = N[binned/Max[binned]]; coordswithdataAll = Table[{normbinned[[x, y, z]], {x, y, z}}, {x, 1, dims[[1]]}, {y, 1, dims[[2]]}, {z, 1, dims[[3]]}]; coordswithdata = Table[Select[coordswithdataAll[[j, i]], #[[1]] != 0 &], {j, dims[[1]]}, {i, dims[[1]]}]; cubes = {ColorData["Rainbow"][#1], Opacity@#1, EdgeForm[], Cuboid@#2} &; output = ParallelMap[cubes @@ # &, coordswithdata, {3}]; Graphics3D[output, PlotRange -> Transpose[{ConstantArray[1, 3], dims + 1}], Lighting -> "Neutral"] 

voxels

Comentarios

  • votar a favor de usted 🙂
  • +1 por ser mucho, mucho más rápido que la Respuesta 1.
  • Deja una respuesta

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