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]
Comentarios
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}]
¡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]
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]]
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
CasesoSelectpara 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"]
Comentarios
Image3D…