Gráficos interactivos con ggiraph

La librería ggiraph permite crear gráficos dinámicos e interactivos. Usaremos este recurso cuando queramos que la persona que visualiza la gráfica tenga acceso a más información (al poner el cursor sobre un punto o sobre una etiqueta), incluso es posible colocar un enlace a una dirección web. También es posible seleccionar qué elementos son visibles en la gráfica. Podemos generar una salida html o usarla con RMarkdown, Shiny…

Primero carguemos las librerías a utilizar

library(ggplot2)
library(ggiraph)
library(ggpubr)

Ahora generamos datos

n=100
c=sample(c(1,2,3,4,5),n,replace=TRUE)
f=sample(c(0,1),n,replace=TRUE)
# Generamos n valores distribuidos uniformemente entre 0 y 10
v1=runif(n,0,10)
# Generamos los valores de v2 como una transformación lineal de v1,
# dependiendo de los factores c y f
v2=c*v1+3+rnorm(n,3*f,1)
# Creamos un data.frame con las variables v1, v2, c y f
datos <- data.frame(x=v1,y=v2,clase=as.factor(c),f=as.factor(f))

Montemos la gráfica con ggplot y luego aplicamos la función girafe

p<-ggplot(datos)+
  aes(v1,v2,color=clase)+
  geom_point_interactive(aes(tooltip=clase,data_id = clase),
                         size=3,hover_nearest = TRUE) 
girafe(ggobj=p)

Si queremos que se muestre una etiqueta sobre cada punto, debemos usar el comando tooltip y especificar qué etiqueta se muestra, así como data_id, que indica qué variable del dataset estamos usando para indicar qué puntos se muestran. Por ejemplo, si queremos mostrar la clase y también los valores de cada punto, podemos escribir

p<-ggplot(datos)+
  aes(v1,v2,color=clase)+
  geom_point_interactive(aes(tooltip=paste0(clase,": (",round(v1,2),
                                            " , ",round(v2,2), ")"),
                             data_id = clase), size=3,hover_nearest = TRUE) 
girafe(ggobj=p)

Si queremos que lo que sea interactivo sean las rectas de regresión, y que nos escriba la ecuación, lo mejor es calcularlas previamente y con el tooltip podemos escribirla.

coef1<-numeric(5)
coef2<-numeric(5)
for (i in 1:5) {
  coef1[i]=round(as.numeric(coef(lm(v2[c==i]~v1[c==i]))[1]),2)
  coef2[i]=round(as.numeric(coef(lm(v2[c==i]~v1[c==i]))[2]),2)

} 

p<-ggplot(datos)+
  aes(x,y,shape=clase,color=clase)+
  geom_point()+
  geom_smooth_interactive(formula=y~x, method="lm",level=0.95,
                          aes(tooltip=paste("R",clase,": y=",coef1[clase]," + ",coef2[clase]," x"),
                          data_id=clase))

girafe(ggobj=p)

En caso de querer exportar esta gráfica a html, lo más cómodo es ejecutarlo en la consola y usar el menú Export del Viewer de RStudio.

Otro ejemplo de gráfica. En este caso, lo que hacemos interactivos son los puntos.

p<-ggplot(datos)+
  aes(x=clase,y=y)+
  geom_boxplot(aes(color=clase))+
  geom_jitter_interactive(position = position_jitter(width = .1),
                color="chocolate",aes(tooltip=paste0("C",clase, ": ",round(v2,2)),data_id=clase))
girafe(ggobj=p)

Con las gráficas de líneas, puede también ser interesante introducir la interactividad.

etiquetas<-c("Clase A","Clase B","Clase C","Clase D","Clase E")

g<-ggplot(datos)+
  aes(x,y,color=clase)+
  geom_line_interactive(aes(color=clase,tooltip=etiquetas[clase],data_id=clase))+
  scale_colour_discrete(name="Tipo",labels=etiquetas)+
  labs(x="Tiempo",y="Variable a estudiar")
girafe(ggobj=g)

Podemos fijar algunas opciones interesantes, como el tamaño de la gráfica, el color, posición y tamaño de las etiquetas, así como poner un botón para zoom y una barra de herramientas.

girafe(ggobj=g,options=list(opts_sizing(rescale=TRUE,width=0.75),
                            opts_tooltip(offx=5,offy=5,
                                         css = "padding:3px;background-color:grey;color:yellow;"),
                            opts_zoom(min=1,max=2),
                            opts_toolbar(position="top",saveaspng=TRUE)))