library(plotly)
## Loading required package: ggplot2
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout

8.1 Marcadores

Al agregar un atributo z a la función plot_ly(), es posible representar marcadores, líneas y trayectorias en tres dimensiones. Por lo tanto, las técnicas aprendidas en las secciones 3.1 y 3.2 pueden ser aplicadas en la creación de gráficos en 3D:

plot_ly(mpg, x = ~cty, y = ~hwy, z = ~cyl) %>%
  add_markers(color = ~cyl)

8.2 Caminos

Para crear una trayectoria en 3D, se utiliza la función add_paths() de la misma forma que se hace para una trayectoria en 2D, pero se agrega una tercera variable z, tal y como se muestra en la Figura 8.2.

plot_ly(mpg, x = ~cty, y = ~hwy, z = ~cyl) %>%
  add_paths(color = ~displ)

8.3 Lineas

En la Figura 8.3 se emplea la función add_lines() en lugar de add_paths() para que los puntos estén conectados mediante el eje x y no por el orden de las filas.

plot_ly(mpg, x = ~cty, y = ~hwy, z = ~cyl) %>%
  add_lines(color = ~displ)

Al igual que con las líneas no 3D, es posible crear múltiples líneas al especificar una variable de agrupamiento.

plot_ly(mpg, x = ~cty, y = ~hwy, z = ~cyl) %>%
  group_by(cyl) %>%
  add_lines(color = ~displ)

8.4 Ejes

Para los gráficos en 3D, es importante tener en cuenta que los objetos de los ejes forman parte de la definición de la escena, que es parte del layout(). Si se desea establecer títulos de ejes (como se muestra en la Figura 8.5), o alguna otra propiedad específica del eje, como la relación entre ejes (es decir, aspectratio), o la configuración predeterminada de la cámara (es decir, camera), se debe hacer mediante la escena.

plot_ly(mpg, x = ~cty, y = ~hwy, z = ~cyl) %>%
  add_lines(color = ~displ) %>%
  layout(
    scene = list(
      xaxis = list(title = "MPG city"),
      yaxis = list(title = "MPG highway"),
      zaxis = list(title = "Number of cylinders")
    )
  )

8.5 Superficies

Se puede crear superficies en 3D con la función add_surface() de manera similar a como se crean mapas de calor con add_heatmap(). Sin embargo, es importante tener en cuenta el orden de los ejes x/y en un gráfico de superficie, ya que plotly.js interpola los valores z. Por lo general, las superficies 3D se utilizan para representar regiones continuas y se puede proporcionar una matriz numérica a z, donde los atributos x e y no tienen que ser especificados, pero si se proporcionan, deben coincidir en longitud con el número de columnas y filas de la matriz, respectivamente.

x <- seq_len(nrow(volcano)) + 100
y <- seq_len(ncol(volcano)) + 500
plot_ly() %>% add_surface(x = ~x, y = ~y, z = ~volcano)