Crear un gráfico de perspectiva 3D en R

Jesse John 30 enero 2023
  1. Argumentos de la Función persp() en R
  2. Gráfico de una superficie plana en R
  3. Trazar a partir de una matriz en R
Crear un gráfico de perspectiva 3D en R

Podemos crear un gráfico en perspectiva de una superficie utilizando la función persp() de la base R. La superficie pasa por los valores z correspondientes a todos los pares de valores (x,y).

Para usar la función persp(), necesitamos entender el formato de sus argumentos principales. El resto de este artículo demuestra y explica esto con ejemplos simples.

Argumentos de la Función persp() en R

Hay tres argumentos x, y y z para las 3 coordenadas ya que persp() se traza en 3 dimensiones.

  1. x e y son vectores numéricos. Estos deben estar en orden ascendente.

  2. El argumento z toma una matriz. Debe haber un valor de z en esta matriz correspondiente a cada combinación de x e y.

    La superficie que se grafica pasa por todos los valores z.

Una forma de crear la matriz para z es usar la función outer() para aplicar una función bivariada a todas las combinaciones de valores x e y.

Por defecto, la función persp() muestra la vista desde el lado negativo del eje y.

  1. El argumento phi da la colatitud. Cambiar phi de 0 a 90 grados afecta a cambiar la vista de adelante hacia arriba.
  2. El argumento theta da el acimut. Cambiar theta de 0 a 90 grados tiene el efecto de girar la figura en el sentido de las agujas del reloj sobre su eje vertical.

Gráfico de una superficie plana en R

Ahora crearemos dos planos y los veremos desde diferentes ángulos. El primero es un plano horizontal.

Código de ejemplo:

# A function that gives a constant z value.
H = function(x, y){
  return (0*x+0*y+1)
}

X = seq(-1,1,length.out=5)
Y = seq(-1,1, length.out=5)

# Apply the H function to all pairs (x,y).
# This gives the z matrix.
Z = outer(X, Y, H)

# Four different views.
persp(x=X,y=Y,z=Z, theta=0, phi=0, xlim=range(-2,2), ylim=range(-2,2), zlim=range(-2,2))
persp(x=X,y=Y,z=Z, theta=0, phi=45, xlim=range(-2,2), ylim=range(-2,2), zlim=range(-2,2))
persp(x=X,y=Y,z=Z, theta=0, phi=90, xlim=range(-2,2), ylim=range(-2,2), zlim=range(-2,2))
persp(x=X,y=Y,z=Z, theta=45, phi=45, xlim=range(-2,2), ylim=range(-2,2), zlim=range(-2,2))

Cifras de salida:

Parcelas de plano horizontal

Las cuatro figuras ilustran el efecto de cambiar los ángulos theta y phi.

A continuación, veremos un plano oblicuo. La sintaxis también ilustra la configuración de otros argumentos de la función persp().

Código de ejemplo:

# A function for a plane.
O = function(x, y){
  return (2*x+3*y-2)
}

X1 = seq(-2,2,length.out=15)
Y1 = seq(-2,2, length.out=15)

# Apply the function to all combinations of x and y.
Z1 = outer(X1, Y1, O)

# Check the range of the values of Z.
# This will help create the limits for the box.
range(Z1)

# Because we do not use the scale=FALSE argument, the output is a cube.
# The axes are scaled.
persp(x=X1,y=Y1,z=Z1, theta=20, phi=10, xlim=range(-5,5), ylim=range(-5,5), zlim=range(-12,8),
      xlab="x-axis",
      ylab="y-axis",
      zlab="z-axis",
      main="Oblique Plane",
      col="#00FFFF",
      ticktype="detailed",
      nticks=3)

# With scale=FALSE.
persp(x=X1,y=Y1,z=Z1, theta=-15, phi=5, xlim=range(-5,5), ylim=range(-5,5), zlim=range(-12,8),
      scale = FALSE,
      xlab="x-axis",
      ylab="y-axis",
      zlab="z-axis",
      main="Oblique Plane",
      col="#FF00FF",
      ticktype="detailed",
      nticks=3)

Cifras de salida:

Parcelas de plano oblicuo

Trazar a partir de una matriz en R

La función persp() puede trazar a partir de una matriz de valores z correspondientes a los vectores x e y en orden creciente.

El número de filas y columnas de z debe coincidir con las longitudes de x e y, respectivamente.

Código de ejemplo:

# Manually create a matrix of z values corresponding
# to all combinations of some x and y.
# (Or use such a pre-existing matrix.)
Z2 = matrix(data=c(1,1,1,1,1,
                  1,-1,-1,-1,1,
                  1,-1,3,-1,1,
                  1,-1,-1,-1,1,
                  1,1,1,1,1), ncol=5)

X2 = seq(-4, 4, length.out=5)
Y2 = seq(-2, 2, by=1)

persp(x=X2, y=Y2, z=Z2, scale=FALSE, col="#CBD68A", theta=30, phi=15)

Figura de salida:

Trazar a partir de una matriz

Autor: Jesse John
Jesse John avatar Jesse John avatar

Jesse is passionate about data analysis and visualization. He uses the R statistical programming language for all aspects of his work.

Artículo relacionado - R Plot