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
Cases
oSelect
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"]
Comentarios
Image3D
…