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)| 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")
grafico1. 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 + d1.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 + f1.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)| 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áfico2b. 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