HOWTO · R

Crear un gráfico de perspectiva 3D en R

Este artículo muestra el uso de la función persp() en R para crear gráficos en perspectiva 3D de una superficie sobre el plano xy en R. Primero explica el formato de los argumentos de la función y luego lo ilustra con ejemplos simples.

En esta página

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