HOWTO · R
Cómo crear un gráfico de superficie 3D a partir de coordenadas (x,y,z)
Crea un gráfico de superficie 3D en R a partir de observaciones dispersas (x, y, z) interpolando una cuadrícula con akima y dibujándola con rgl.
En esta página
Para crear un gráfico de superficie 3D en R a partir de observaciones dispersas (x, y, z), estima valores z en una cuadrícula con akima::interp() y luego dibuja esa cuadrícula con rgl::persp3d(). Añade las observaciones originales con rgl::points3d() para comparar las mediciones con la superficie estimada. La interpolación proporciona estimaciones entre observaciones; no garantiza que la superficie estimada coincida con una función subyacente desconocida.
Interpolar valores Z con akima::interp()
Un renderizador de superficies necesita valores z asociados a una cuadrícula de coordenadas x e y. Las observaciones dispersas no suelen formar esa cuadrícula, por lo que la interpolación estima valores en las posiciones de la cuadrícula a partir de los datos x, y y z medidos. Mantén los tres vectores de entrada alineados: los valores en el mismo índice deben describir la misma observación. Por ejemplo, x[i], y[i] y z[i] son un punto medido.
La función akima::interp() acepta esos vectores de coordenadas y devuelve coordenadas de cuadrícula x e y junto con una matriz de valores z interpolados. Esa estructura es útil para dibujar porque las entradas de la matriz corresponden a posiciones a través de la cuadrícula de coordenadas devuelta. Las estimaciones dependen de las mediciones y del método de interpolación; no son observaciones adicionales. Inspecciona las coordenadas y la matriz devueltas al adaptar el ejemplo a tus datos, especialmente si tus observaciones son escasas o están distribuidas de forma desigual.
Instala los paquetes necesarios una vez con install.packages(c("akima", "rgl")). Cárgalos en la sesión de R con library(akima) y library(rgl), o llama a sus funciones con los prefijos de paquete mostrados a continuación. Las funciones de interpolación y renderizado también están escritas con prefijos de paquete explícitos en el ejemplo para dejar claro su origen.
Dibujar la superficie con rgl::persp3d()
Pasa las coordenadas x, las coordenadas y y la matriz z del resultado de la interpolación a rgl::persp3d(). Esto dibuja la cuadrícula estimada como una superficie. Luego pasa los vectores originales x, y y z a rgl::points3d() para superponer los puntos medidos. Mantener ambas capas visibles ayuda a distinguir los datos observados de los valores estimados entre observaciones.
La vista de rgl es interactiva en un entorno gráfico adecuado: gírala para inspeccionar la forma desde otro ángulo y haz zoom para examinar detalles. El aspecto de la vista depende de la sesión de R y del entorno gráfico. En un contexto no interactivo, es posible que la visualización no se abra como una ventana de escritorio; usa un entorno compatible con rgl cuando necesites manipular la vista.
Ejemplo completo: interpolar y dibujar una superficie 3D
Instala akima y rgl una vez con install.packages(c("akima", "rgl")). Con ambos paquetes disponibles, el flujo de trabajo de paquetes es surface <- akima::interp(x, y, z, nx = 3, ny = 3), seguido de rgl::persp3d(surface$x, surface$y, surface$z) y rgl::points3d(x, y, z). El ejemplo ejecutable siguiente usa un conjunto completo de observaciones de muestra de 3 por 3, por lo que R base también puede dibujar la misma cuadrícula cuando cualquiera de los paquetes de dibujo opcionales no está disponible. Para mediciones dispersas, usa la llamada a akima::interp() anterior para estimar los valores de la cuadrícula antes de dibujar.
x <- c(0, 1, 2, 0, 1, 2, 0, 1, 2)
y <- c(0, 0, 0, 1, 1, 1, 2, 2, 2)
z <- c(0, 1, 0, 1, 2, 1, 0, 1, 0)
if (requireNamespace("akima", quietly = TRUE)) {
surface <- akima::interp(x = x, y = y, z = z, nx = 3, ny = 3)
z_grid <- surface$z
x_grid <- surface$x
y_grid <- surface$y
} else {
z_grid <- matrix(z, nrow = 3, byrow = TRUE)
x_grid <- y_grid <- 0:2
}
if (requireNamespace("rgl", quietly = TRUE)) {
rgl::persp3d(x = x_grid, y = y_grid, z = z_grid, col = "lightblue")
rgl::points3d(x = x, y = y, z = z, col = "red", size = 6)
} else {
persp(x = x_grid, y = y_grid, z = z_grid, col = "lightblue")
}
cat("Grid dimensions:", nrow(z_grid), "x", ncol(z_grid), "\n")
Los vectores de muestra describen nueve observaciones en una cuadrícula regular. Cuando akima está instalado, el script obtiene su cuadrícula de akima::interp(); de lo contrario, usa directamente los valores de cuadrícula regular proporcionados. Usa rgl::persp3d() y rgl::points3d() cuando rgl está instalado, con persp() de R base como alternativa de dibujo. La salida de la línea de comandos es:
Grid dimensions: 3 x 3
Para mediciones dispersas, instala ambos paquetes y usa las llamadas a akima y rgl descritas anteriormente. Los valores de cuadrícula mostrados son estimaciones derivadas de los datos de entrada, mientras que los puntos superpuestos siguen siendo las observaciones originales. La vista interactiva depende de la sesión de R y del entorno gráfico; usa una sesión con capacidad gráfica cuando necesites girarla o hacer zoom. Mantén las entradas x, y y z alineadas al reemplazar los vectores de muestra.