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

Como resultado, simplemente agregando un atributo z, plot_ly() sabrá cómo representar marcadores, líneas y rutas en tres dimensiones. Eso significa que todas las técnicas que aprendimos en las Secciones 3.1 y 3.2 pueden reutilizarse para gráficos 3D:

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

Para hacer una ruta en 3D, use add_paths() de la misma manera que lo haría para una ruta en 2D, pero agregue una tercera variable z, como lo hace la Figura 8.2.

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

La Figura 8.3 usa add_lines() en lugar de add_paths() para garantizar que los puntos estén conectados por el eje x en lugar del orden de las filas.

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

Al igual que con las líneas que no son 3D, puede crear varias líneas especificando una variable de agrupación

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

Para gráficos 3D, tenga en cuenta que los objetos de eje son parte de la definición de la escena, que es parte del diseño (). Es decir, si desea establecer títulos de eje (por ejemplo, Figura 8.5), o algo más específico para la definición de eje, la relación entre ejes (es decir, relación de aspecto) o la configuración predeterminada de la cámara (es decir, cámara); lo harías a través de 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")
    )
  )

Crear superficies 3D con add_surface() es muy parecido a crear mapas de calor con add_heatmap(). De hecho, incluso puede crear superficies 3D sobre x/y categóricas (¡intente cambiar add_heatmap() por add_surface() en la Figura 7.3)! Dicho esto, debería haber una ordenación sensata de los ejes x/y en un gráfico de superficie, ya que plotly.js interpola los valores z. Por lo general, la superficie 3D se encuentra sobre una región continua, como se hace en la Figura 8.6 para mostrar la altura de un volcán. Si se proporciona una matriz numérica a z como en la figura 8.6, no es necesario proporcionar los atributos x e y, pero si lo son, la longitud de x debe coincidir con el número de columnas de la matriz y debe coincidir con el número de columnas y filas

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