Árbol de Navidad en 3D con R

La Navidad llegó a nuestros tutoriales. Aquí te mostraré un código reproducible para producir un arbolito de navidad en 3D usando plotly, para que sorprendas a tus colegas esta noche buena.

Librerías

# Instalar
install.packages("tidyverse")
install.packages("plotly")
# Activar
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5     v purrr   0.3.4
## v tibble  3.1.4     v dplyr   1.0.7
## v tidyr   1.1.4     v stringr 1.4.0
## v readr   2.0.2     v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(plotly)
## 
## 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

Bases de datos

datos_arbol <- data.frame(index = 1:300) %>%
  mutate(z=seq(1,300,1),
         x=cos(z/5)*index-1,
         y=sin(index/5)*index-1,
         grupo=rep("arbol",300)) %>% 
  arrange(index)

datos_adornos1 <- data.frame(index = 1:30) %>%
  mutate(z=seq(1,300,10),
         x=cos(z/5+6)*(index+z+55),
         y=sin(z/5+6)*(index+z+55),
         grupo=rep("adorno",30))

datos_adornos2 <- data.frame(index = 1:30) %>%
  mutate(z=seq(1,300,10),
         x=cos(z/5+20)*(index+z+10),
         y=sin(z/5+20)*(index+z+10),
         grupo=rep("adorno",30))

datos_adornos3 <- data.frame(index = 1:30) %>%
  mutate(z=seq(1,300,10),
         x=cos(z/5+80)*(index+z+10),
         y=sin(z/5+80)*(index+z+10),
         grupo=rep("adorno",30))

estrella <- data.frame(index=300, x=-0.0199334,
                       y=-0.8013307, z=300, grupo="estrella")

Gráfico 3D

plot_ly(showlegend=FALSE) %>%
  add_markers(data = datos_arbol, x=~x, y=~y, z=~rev(index),
              marker = list(color = 'darkgreen', symbol = 'circle')) %>% 
  add_markers(data = datos_adornos1, x=~x, y=~y, z=~rev(z),
              marker = list(color = '#ed0057', symbol = 'circle')) %>%
  add_markers(data = datos_adornos2, x=~x, y=~y, z=~rev(z),
              marker = list(color = '#ed8200', symbol = 'circle')) %>%
  add_markers(data = datos_adornos3, x=~x, y=~y, z=~rev(z),
              marker = list(color = '#4ad2ff', symbol = 'circle')) %>%
  add_text(data = estrella, x=~x, y=~y, z=~z-10, text = '⭐',
           textfont = list(color="gold", size=30)) %>% 
  layout(scene = list(aspectmode = "manual", aspectratio = list(x=1, y=1, z=1.2),
                      xaxis = list(range=c(-500, 500)),
                      yaxis = list(range=c(-500, 500)))) 


El gráfico exportado en html usando Windows genera que la estrella se convierta en código ascii. Lamentablemente no se pueden usar los símbolos de plotly en R. Con python hay una gama amplia de puntos a proyectar.

Para más información visita:

Irwing S. Saldaña
Irwing S. Saldaña
Director ejecutivo & Profesor investigador

Relacionado