En R se puede crear cualquier tipo de gráfico que tengamos en mente gracias a ggplot2. Este es un paquete de visualización de datos de código abierto para el lenguaje R, ideal para, como dice Wickhman, reducir la distancia entre el gráfico pensado y el que estás creando en tu script.

Adicionalmente, no hay nada que no pueda cambiar mediante el uso de paquetes R para mejorar la salida, y en cuestión de gráficos esto no queda atrás, es por eso que el objetivo de este artículo es llevar nuestros gráficos a otro nivel con el uso de 2 extensiones de ggplot2: ggforce y ggiraph.


GGFORCE

Logra enmarcar las características de la variable en el gráfico.

Para ejemplificar esta funcion se hará uso de la data airports del paquete nycflights13.

library(datos)
library(nycflights13)
attach(airports)
skimr::skim(airports)
Data summary
Name airports
Number of rows 1458
Number of columns 8
_______________________
Column type frequency:
character 4
numeric 4
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
faa 0 1 3 3 0 1458 0
name 0 1 4 51 0 1440 0
dst 0 1 1 1 0 3 0
tzone 3 1 14 19 0 9 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
lat 0 1 41.65 10.45 19.72 34.26 40.09 45.07 72.27 ▂▇▆▂▁
lon 0 1 -103.39 29.84 -176.65 -119.19 -94.66 -82.52 174.11 ▅▇▁▁▁
alt 0 1 1001.42 1523.63 -54.00 70.25 473.00 1062.50 9078.00 ▇▁▁▁▁
tz 0 1 -6.52 1.62 -10.00 -8.00 -6.00 -5.00 8.00 ▆▇▁▁▁

Se hará un gráfico mostrando los timezones según longitud y latitud como ejes.

grafico <- airports %>%
  filter(lon < 0, tzone != "\\N") %>%
  ggplot(aes(lon, lat, color = tzone)) + 
  geom_point(show.legend = FALSE)  +
  theme(legend.position = "none")
grafico

1. Geom_mark_…

La capa geom_mark_... permite enmarcar las características de una variable en el gráfico, separar los grupos o los clusters para un reconocimiento visual automático.

grafico + geom_mark_rect()

Este marco creado puede ser de diferentes formas que se verán a continuación:

grafico + labs(title = 'a. Circulo') + geom_mark_circle()  -> a
grafico + labs(title = 'b. Elipse') + geom_mark_ellipse() -> b
grafico + labs(title = 'c. Hull') + geom_mark_hull() -> c
grafico + labs(title = 'd. Rectangulo') + geom_mark_rect() -> d

a + b + c + d

1.a. Relleno

Las formas generadas se pueden rellenar con la opcion fill = misma variable usada en 'color', dentro de capa aes().

grafico  + labs(title = 'Rellenando') + geom_mark_circle(aes(fill = tzone))

1.b. Expansión del marco

Se puede variar el tamaño con el atributo expand = unit( , ), que va dentro de la capa geom_mark_… elegida. El número debe ser positivo y la unidad de medida a elección

grafico  + labs(title = 'Expasión de 1 mm.') + 
  geom_mark_circle(aes(fill = tzone), expand = unit(1, "mm")) -> e

grafico  + labs(title = 'Expansión de 2 cm.') + 
  geom_mark_circle(aes(fill = tzone), expand = unit(2, "cm")) -> f

e + f

1.c. Labels

Se debe añadir el argumento aes(label = misma variable usada en 'color') dentro de la capa geom_mark_… elegida.

grafico + labs(title = 'Añadiendo labels') + 
  geom_mark_circle(aes(fill = tzone, label = tzone))

2. Facet_zoom

Con la capa facet_zoom() se genera un acercamiento a una zona del gráfico en particular. Esto se puede hacer de dos formas:

2.a. Con Coordenadas

Se deben delimitar las coordineadas del gráfico, indicando dos valores para el eje X, y otros 2 para el eje Y, formando un cuadrilatero que tendrá el aumento.

grafico + labs(title = 'Haciendo zoom a una zona')  + facet_zoom(xlim = c(-115, -108), ylim = c(31, 37))

2.b. Con nombre de variable

Se puede hacer el aumento colocando el nombre de la variable categórica de relleno (fill).

grafico + labs(title = 'Haciendo zoom a una zona')  + facet_zoom(xy = tzone == "Pacific/Honolulu")

Ejemplo avanzado

Ahora veremos otra utilidad del paquete con la ayuda de la data titanic del paquete reshape2.

# Data de los pasajeros sobrevivientes en el Titanic
# Variables:
## Class: 1ra, 2da o 3ra clase
## Sex: F/M
## Age: edad


data <- reshape2::melt(Titanic)
# Función "melt" convierte en data frame un objeto
str(data)
## 'data.frame':    32 obs. of  5 variables:
##  $ Class   : Factor w/ 4 levels "1st","2nd","3rd",..: 1 2 3 4 1 2 3 4 1 2 ...
##  $ Sex     : Factor w/ 2 levels "Male","Female": 1 1 1 1 2 2 2 2 1 1 ...
##  $ Age     : Factor w/ 2 levels "Child","Adult": 1 1 1 1 1 1 1 1 2 2 ...
##  $ Survived: Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
##  $ value   : num  0 0 35 0 0 0 17 0 118 154 ...
## Survived: sobrevivientes
skimr::skim(data)
Data summary
Name data
Number of rows 32
Number of columns 5
_______________________
Column type frequency:
factor 4
numeric 1
________________________
Group variables None

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
Class 0 1 FALSE 4 1st: 8, 2nd: 8, 3rd: 8, Cre: 8
Sex 0 1 FALSE 2 Mal: 16, Fem: 16
Age 0 1 FALSE 2 Chi: 16, Adu: 16
Survived 0 1 FALSE 2 No: 16, Yes: 16

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
value 0 1 68.78 136 0 0.75 13.5 77 670 ▇▁▁▁▁
gather_set_data(data, 1:4) -> data
# Para las columnas que se van a usar como ejes
# en los conjuntos paralelos

ggplot(data, aes(x, id = id, split = y, value = value)) +
  geom_parallel_sets(aes(fill = Sex), alpha = 0.3, axis.width = 0.1) +
  geom_parallel_sets_axes(axis.width = 0.1) +
  geom_parallel_sets_labels(colour = 'white')

Con el gráfico de conjuntos parelelos se pueden mostrar datos categóricos multidimensionales y las relaciones que hay entre cada uno de ellos.

En este caso se analizó las variables clase, sexo, edad y sobrevivientes.

Gracias a este gráfico se puede concluir que la mayoría de pasajeros del sexo femenino pertenecen a 1ra, 2da y 3ra clase. Además han sido poco los tripulantes del sexo femenino que no sobrevivieron al incidente.

Existe una mayor cantidad de pasajeros del sexo masculino respecto al sexo femenino en la tripuación al igual que en los pasajeros que son adultos.


GGIRAPH

GGIRAPH

ggiraph es un paquete de R que permite crear gráficos interactivos a partir de gráficos hechos con ggplot2, una de las bibliotecas más populares para crear gráficos en R. La biblioteca ggiraph permite añadir interacciones y efectos visuales a tus gráficos, como por ejemplo tooltips (información que se muestra al pasar el cursor sobre un punto o elemento del gráfico), colores dinámicos, y más.

Una de las ventajas de ggiraph es que es compatible con los gráficos creados con ggplot2. Con ggiraph, se puede tomar un gráfico creado con ggplot2 y hacerlo interactivo con una simple función.

En resumen, ggiraph es una herramienta útil para los que desean crear gráficos interactivos con R y ggplot2.

2a. Gráfico de barras interactivo con ggraph

Mediante la función geom_col_interactive, se permite agregar un tooltip, a acada una de las barras. Mostrando información adicional, en este caso la variable ventas.

library(ggiraph)

# Crear conjunto de datos
df <- data.frame(
  mes = c("Ene", "Feb", "Mar", "Abr", "May", "Jun"),
  ventas = c(100, 120, 130, 145, 160, 170)
)

### Gráfico de barras interactivo
gg_col1<- ggplot(df, aes( x = mes, y = ventas, 
                          tooltip = ventas,
                          data_id = mes ) 
) + ggtitle("Ventas mensuales")+
  geom_col_interactive() #geometria
girafe(ggobj = gg_col1) #Generas el gráfico

2b. Gráfico de puntos interactivo con ggraph

Mediante la función geom_point_interactive, se permite agregar un tooltip, a cada uno de los puntos. Mostrando información adicional, en este caso, el nombre del punto.

library(ggplot2)
library(ggiraph)
data <- mtcars
View(mtcars)
data$carname <- row.names(data)

gg_point = ggplot(data = data) +
  geom_point_interactive(    aes(x = wt, y = qsec, 
                                 color = disp,#Variable numérica asociada a la intensidad del color
                                 tooltip = carname, #la información extra 
                                 data_id = carname)) + #de donde obtienes 
  theme_minimal()

girafe(ggobj = gg_point) #Generas el gráfico