Como puedes imaginar, aún tenemos que ver más elementos de ggplot2: los títulos y leyendas, los ejes, el tema, coordenadas, etc… vamos a ello!!
Más elementos de un ggplot()
Ya hemos presentado los principales elementos de los gráficos hechos con ggplot2, pero es evidente que un gráfico tiene más elementos.
Lógicamente, hay que conocerlos un poco para poder ajustar los gráficos a nuestras necesidades y mejorar su calidad.
Veremos algo de los siguientes elementos:
Títulos del gráfico
Themes
Small multiples (o Facetting)
Anotaciones
Ejes
Escalas
Stats (transformaciones estadísticas)
Position adjustments
Coordenadas
3.1 Títulos del gráfico
Un gráfico para ser efectivo y mostrar su mensaje con claridad debe tener un título y/o subtítulo ilustrativos y mostrar información relevante sobre las variables que se grafican
Este tipo de elementos pueden modificarse de varias maneras, pero nos centraremos en la función labs()
Añadiendo títulos, leyenda, etc …a un ggplot
p <-ggplot(iris, aes(Sepal.Length, Petal.Length, color = Species)) +geom_point()p
Añadiendo títulos, leyenda, etc …a un ggplot
p +
p +labs(title ="Gráfico 1: Longitud del sépalo frente al pétalo") +
p +labs(title ="Gráfico 1: Longitud del sépalo frente al pétalo") +labs(subtitle ="(diferenciando por especie de lirio)") +
p +labs(title ="Gráfico 1: Longitud del sépalo frente al pétalo") +labs(subtitle ="(diferenciando por especie de lirio)") +labs(caption ="Datos provenientes del Iris dataset") +
p +labs(title ="Gráfico 1: Longitud del sépalo frente al pétalo") +labs(subtitle ="(diferenciando por especie de lirio)") +labs(caption ="Datos provenientes del Iris dataset") +labs(x ="Longitud del sépalo") +
p +labs(title ="Gráfico 1: Longitud del sépalo frente al pétalo") +labs(subtitle ="(diferenciando por especie de lirio)") +labs(caption ="Datos provenientes del Iris dataset") +labs(x ="Longitud del sépalo") +labs(y ="Longitud del pétalo") +
p +labs(title ="Gráfico 1: Longitud del sépalo frente al pétalo") +labs(subtitle ="(diferenciando por especie de lirio)") +labs(caption ="Datos provenientes del Iris dataset") +labs(x ="Longitud del sépalo") +labs(y ="Longitud del pétalo") +labs(color ="Especie de lirio") +
p +labs(title ="Gráfico 1: Longitud del sépalo frente al pétalo") +labs(subtitle ="(diferenciando por especie de lirio)") +labs(caption ="Datos provenientes del Iris dataset") +labs(x ="Longitud del sépalo") +labs(y ="Longitud del pétalo") +labs(color ="Especie de lirio") +labs(tag ="Plot 1")
El chunk no se suele escribir de esa forma, sino así:
p <- p +labs(title ="Gráfico 1: Longitud del sépalo frente al pétalo",subtitle ="(diferenciando por especie de lirio)",caption ="Datos provenientes del Iris dataset",x ="Longitud del sépalo",y ="Longitud del pétalo",color ="Especie de lirio",tag ="Plot 1")
Texto alternativo: gráficos accesibles
Las personas que usan lectores de pantalla no “ven” el gráfico. Con labs(alt = ...) podemos añadir un texto alternativo que describa lo que muestra:
p +labs(alt ="Gráfico de puntos: la longitud del pétalo crece con la del sépalo; los lirios setosa forman un grupo aparte, con pétalos mucho más cortos")
En Quarto también se puede poner con la opción de chunk #| fig-alt: "..."
Un buen texto alternativo no describe el código, sino el mensaje del gráfico
A veces interesa eliminar elementos de los labels/títulos
p +
p +labs(color =NULL) +#- borra el título de la leyenda
p +labs(color =NULL) +#- borra el título de la leyendalabs(x =NULL) +#- borra el título del eje X
p +labs(color =NULL) +#- borra el título de la leyendalabs(x =NULL) +#- borra el título del eje Xlabs(subtitle =NULL) +
p +labs(color =NULL) +#- borra el título de la leyendalabs(x =NULL) +#- borra el título del eje Xlabs(subtitle =NULL) +labs(caption =NULL) +
p +labs(color =NULL) +#- borra el título de la leyendalabs(x =NULL) +#- borra el título del eje Xlabs(subtitle =NULL) +labs(caption =NULL) +labs(title =NULL) +
p +labs(color =NULL) +#- borra el título de la leyendalabs(x =NULL) +#- borra el título del eje Xlabs(subtitle =NULL) +labs(caption =NULL) +labs(title =NULL) +labs(y =NULL) +#- borra el título del eje Y
p +labs(color =NULL) +#- borra el título de la leyendalabs(x =NULL) +#- borra el título del eje Xlabs(subtitle =NULL) +labs(caption =NULL) +labs(title =NULL) +labs(y =NULL) +#- borra el título del eje Ylabs(tag =NULL)
Para los labels de los ejes X e Y es muy frecuente usar: xlab(NULL) y ylab(NULL)
Queda la leyenda. La leyenda no es un elemento de los labels/título, sino del theme. Se puede eliminar con: theme(legend.position = "none")
3.2 Theme: cambiando la apariencia del gráfico
Los themes controlan la apariencia de todo lo que no son los datos. Podemos usar un tema completo, como theme_bw(), o ajustar elementos concretos con theme()
Theme: cambiando la apariencia del gráfico
Podemos cambiar los detalles de la apariencia del gráfico; por ejemplo, el tamaño, fuente y color de los títulos, pero también de los puntos, las líneas, el fondo del gráfico, la apariencia de las grid-lines, el lugar para las leyendas, etc … etc …. Para hacerlo hay que usar las “funciones de tema”. Todas ellas comienzan con theme_()
En general con las funciones theme_() podemos cambiar/ajustar cualquier elemento del gráfico, con la excepción de la propia representación de los datos (ya sabemos que esto se hacen con las funciones geom_()). Estos elementos afectan a la apariencia y detalles del gráfico, pero no a la relación entre variables que se muestra realmente en el gráfico.
Themes/Temas predefinidos
p +
p +theme_gray() +#- tema por defecto
p +theme_gray() +#- tema por defectotheme_light() +
p +theme_gray() +#- tema por defectotheme_light() +theme_dark() +
p +theme_gray() +#- tema por defectotheme_light() +theme_dark() +theme_classic() +
p +theme_gray() +#- tema por defectotheme_light() +theme_dark() +theme_classic() +theme_minimal() +
p +theme_gray() +#- tema por defectotheme_light() +theme_dark() +theme_classic() +theme_minimal() +theme_void()
Podemos fijar el theme (para los siguientes gráficos)
#-podemos fijar un theme concretotheme_set(theme_minimal())# podemos fijar un theme y variar algún elemento (p.ej: eje X sin ticks ni escalas)theme_set(theme_minimal() +theme(axis.text.x =element_blank()))# si queremos volver al default themetheme_set(theme_gray())
Ejemplos de elementos cuya apariencia podemos cambiar con theme()
En realidad se puede cambiar todo. Puedes mirar la ayuda con: help(theme) o con args(theme)
Algunos ejemplos
#- LEYENDAp +theme(legend.position ="none") #- que no aparezca leyendap +theme(legend.position ="bottom") #- leyenda abajop +theme(legend.direction ="horizontal") #- leyenda horizontal!!p +theme(legend.title =element_text(size =22)) #- título de la leyenda a 22p +theme(legend.key.size =unit(2.4, "cm")) #- tamaño de los cuadros de la leyenda#- Elementos de textop +theme(text =element_text(size =20, face ="bold")) #- cambiar tamaño de todos los elementos de textop +theme(text =element_text(face ="bold")) #- pone en negrita todos los elementos de texto
Más ejemplos de elementos cuya apariencia podemos cambiar con theme()
#- EJESp +theme(axis.text.x =element_text(colour ="pink", size =12,angle =90, vjust =+3.5)) # apariencia de la escala del eje xp +theme(axis.title.y =element_text(size =15, angle =75)) #- tamaño y ángulo del texto del eje Y#- TÍTULOSp +theme(plot.subtitle =element_text(hjust =-3)) #- posición horizontal del subtítulo (si lo tuviese)p +theme(plot.caption =element_text(hjust =8)) #- posición horizontal del pie de gráfico (si lo tuviese)#- BACKGROUNDp +theme(panel.background =element_rect(fill ="green", colour ="pink",linetype ="longdash", linewidth =3.5))p +theme(panel.background =element_blank())p +theme(panel.background =NULL)p +theme(plot.background =element_rect(fill ="pink", colour ="purple",linetype ="dotted", linewidth =7))
¿Cómo se llaman todos los elementos del gráfico?
En este tweet de Henry Wang hay una imagen con los nombres de todos los elementos de un gráfico ggplot (y la función element_xx() que los modifica). La explicación completa está en su blog.
Sé poquito de colores, pero claro, si quieres cambiar la apariencia de los gráficos, has de saber los colores de R, así que:
R tiene 657 colores con nombre. Para ver la lista ejecuta: aa <- as.data.frame(colours())
Si sabes el nombre del color que quieres, [aquí], podrás buscarlo y ver su color y su codificación en RGB y Hex.
También es interesante el [paquete paleteer] que agrupa un conjunto amplio de paletas de colores para usar en R.
Paletas de colores (y daltonismo)
Alrededor de un 8% de los hombres tiene algún tipo de daltonismo: el rojo y el verde de la paleta por defecto les cuesta distinguirlos
Mejor usar paletas pensadas para eso: viridis (viene con ggplot2) o algunas de ColorBrewer como "Dark2"
p +scale_color_viridis_d()
p +scale_color_brewer(palette ="Dark2")
3.3 Small multiples (o facetting)
El sistema gráfico de ggplot2 incorpora una técnica especial llamada “faceting” que permite dividir un gráfico en múltiples gráficos.
Cada uno de esos múltiples gráficos se realiza sólo para las observaciones de uno de los valores de una variable categórica (o factor) incluido en el conjunto de datos. Es más fácil hacerlo que explicarlo/escribirlo.
Small multiples (o facetting)
Veámoslo en acción con el conjunto de datos iris. En iris, hay una variable: Species que es un factor, es una variable categórica.
#- volvemos a crear p, ahora sin títulosp <-ggplot(iris, aes(Sepal.Length, Petal.Length, color = Species)) +geom_point()p
Small multiples con facet_grid() y facet_wrap()
p +
p +facet_grid(cols =vars(Species)) +# gráficos x columnas
p +facet_grid(cols =vars(Species)) +# gráficos x columnasfacet_grid(rows =vars(Species)) +# gráficos x filas
p +facet_grid(cols =vars(Species)) +# gráficos x columnasfacet_grid(rows =vars(Species)) +# gráficos x filasfacet_wrap(vars(Species), nrow =2, ncol =2) # filas y columnas
Small multiples con facet_grid() y facet_wrap()
La forma habitual de escribir ese código es:
p +facet_grid(cols =vars(Species)) # gráficos x columnasp +facet_grid(rows =vars(Species)) # gráficos x filasp +facet_wrap(vars(Species), nrow =2, ncol =2) # graf x filas y columnas
En muchos ejemplos (y en internet) verás los facets escritos con una fórmula (~). Es equivalente:
p +facet_wrap(~ Species) #- igual que facet_wrap(vars(Species))p +facet_grid(rows =vars(Species)) #- igual que facet_grid(Species ~ .)p +facet_grid(cols =vars(Species)) #- igual que facet_grid(. ~ Species)
Small multiples con 2 variables categóricas
Iris sólo tiene un factor, así que vamos a discretizar una variable del dataset:
Por defecto las escalas de los ejes de los small multiple son comunes, pero podemos cambiarlo:
p +facet_grid(rows =vars(Species)) #- escalas comunesp +facet_grid(rows =vars(Species), scales ="free") #- las escalas de cada small pueden variarp +facet_grid(rows =vars(Species), scales ="free_y") #- solo dejamos libre/variar la escala del eje y
3.4 Más elementos de ggplot2: Anotaciones (!!)
Las anotaciones son un tipo especial de capa que no hereda los mappings globales del gráfico. Sirven para añadir información fija de referencia
3.4 Más elementos de ggplot2: Anotaciones (!!)
Las anotaciones permiten resaltar algún fenómeno o observación de interés y son importantes a la hora de contar historias (storytelling) con los gráficos y visualizaciones.
En el entorno ggplot podemos hacer anotaciones en nuestros gráficos de varias maneras: veremos un poco de 3:
con la función annotate().
con geom_text()
con geom_vline() , geom_hline() y geom_abline()
Anotaciones con annotate()
p +
p +annotate(geom ="text",x =6,y =2,label ="Una anotación",size =5) +
Los límites del gráfico suelen obtenerse automáticamente pero a veces nos puede interesar cambiarlos
3.5 Más elementos de ggplot2: límites de los ejes
Los límites o dominio del gráfico suelen obtenerse automáticamente de los datos, pero, según Hadley Wickham, hay dos razones por las que podemos estar interesados en cambiar los límites del gráfico:
centrarnos en una región específica del gráfico
aumentar los límites para que varios gráficos ajusten sus escalas.
Si quieres modificar el recorrido de los ejes, los “límites” de los ejes, puedes usar lims(). Para los ejes X e Y hay dos funciones auxiliares: xlim() e ylim().
En realidad-realidad los límites de los ejes se controlan con scale_xx()
#limites: x[4-8] y[1-7]p +lims(x =c(NA,6)) +lims(y =c(1,8)) +lims(color =c("setosa")) +xlim(c(5, 6)) +ylim(c(NA, 5)) +#- podemos dar la vuelta a los ejesxlim(c (7, 3)) +
#limites: x[4-8] y[1-7]p +lims(x =c(NA,6)) +lims(y =c(1,8)) +lims(color =c("setosa")) +xlim(c(5, 6)) +ylim(c(NA, 5)) +#- podemos dar la vuelta a los ejesxlim(c (7, 3)) +ylim(c(NA, 5))
Ojo: lims(), xlim() e ylim()eliminan (convierten en NA) los datos que quedan fuera de los límites. Por eso R avisa: Removed n rows containing missing values
Haciendo zoom en un gráfico
p +
p +xlim(c(4, 5)) +
p +xlim(c(4, 5)) +ylim(c(NA, 5))
Haciendo zoom: cuidado!!
Si cambias los límites de un gráfico para hacer un zoom, hay que tener cuidado ya que si después utilizas alguna transformación estadística como por ejemplo geom_smooth(), las observaciones eliminadas al ajustar los límites no entrarán en el cálculo estadístico.
Como nos cuentan aquí hay razones para que el eje Y de un gráfico empiece en 0.
3.6 Más elementos de ggplot2: Escalas (!!)
Las escalas permiten interpretar los elementos geométricos (por ejemplo los puntos) en función de los valores originales de las observaciones. Las escalas controlan cómo se traducen los valores de los datos a propiedades visuales.
3.6 Más elementos de ggplot2: Escalas (!!)
Las escalas permiten leer/interpretar un gráfico.
A veces es importante pararse a pensar cuál es la mejor escala para representar las variables. Quizás sea conveniente cambiar la escala de un eje para distribuir mejor las observaciones en el espacio, o para interpretar mejor las variaciones entre observaciones; por ejemplo la escala logarítmica o en porcentajes son a veces más apropiadas que las escalas originales.
Las escalas en ggplot2 se crean/controlan con una familia de funciones: scale_xx(). Estas funciones también construyen los elementos que permiten leer/interpretar los gráficos: los ejes y las leyendas.
Como ggplot2 genera las escalas y leyendas automáticamente, en la práctica podemos hacer gráficos sin saber cómo funcionan las scale_xx(). PERO, en realidad, para cada par variable/estética representada en un gráfico ggplot es necesaria una escala, y tendría que fijarse con una de las funciones de la familia scale_xx()
3.6 Más elementos de ggplot2: Escalas (!!)
ggplot2 genera las escalas automáticamente. Cuando hacemos este gráfico:
p +labs(x ="Eje X",y ="Eje Y",color ="Leyenda\n para el color") +
p +labs(x ="Eje X",y ="Eje Y",color ="Leyenda\n para el color") +scale_x_continuous(breaks =seq(3, 10, 0.5),limits =c(3, 10)) +
p +labs(x ="Eje X",y ="Eje Y",color ="Leyenda\n para el color") +scale_x_continuous(breaks =seq(3, 10, 0.5),limits =c(3, 10)) +scale_y_continuous(breaks =seq(0, 12, 0.25),labels = scales::label_number(suffix =" cm")) +
p +labs(x ="Eje X",y ="Eje Y",color ="Leyenda\n para el color") +scale_x_continuous(breaks =seq(3, 10, 0.5),limits =c(3, 10)) +scale_y_continuous(breaks =seq(0, 12, 0.25),labels = scales::label_number(suffix =" cm")) +scale_color_manual(values =c("purple", "pink", "red2"),name ="Especies\n de lirios")
3.7 Más elementos de ggplot2: Stats(!!!!)
Algunos gráficos, como los de puntos, no requieren transformaciones estadísticas, pero otros gráficos como las curvas de predicción o los boxplots, sí que las necesitan.
Podemos usar transformaciones estadísticas en gráficos ggplot con la familia de funciones stat_xx()
3.7 Stats (transformaciones estadísticas)
Algunos gráficos, como los de puntos, no requieren transformaciones estadísticas: lo que se grafica coincide con los valores de las observaciones. Ciertos gráficos, por ejemplo los boxplots, no se representan las variables originales, sino una transformación de estas.
Podemos usar transformaciones estadísticas en gráficos ggplot con la familia de funciones stat_xx().
Cada geom_xx() que utilicemos, en realidad necesita de un stat_xx(), entonces ¿por qué nunca lo hemos usado nosotros? Con ggplot2 la razón es casi siempre la misma: porque under the hood ggplot2 hace muchas cosas por nosotros. En concreto, cada vez que usamos un geom_xx() ggplot2 está fijando una transformación estadística por defecto por nosotros.
Todas las capas tienen un ajuste de posición que resuelve qué hacer cuando los elementos geométricos se solapan. Se cambia con el argumento position de cada geom_xx() o stat_xx()
3.8 Position adjustments (un ejemplo)
p_pos <-ggplot(iris, aes(Sepal.Length, Petal.Length)) +geom_point()p_pos +geom_point(position ="jitter", color ="pink")
También se puede usar geom_jitter()
p_pos +geom_jitter(color ="pink")
3.8 Position adjustments (otro ejemplo)
p_bar <-ggplot(mtcars, aes(factor(cyl), fill =factor(vs)))p1 <- p_bar +geom_bar() #- apiladas (por defecto)p2 <- p_bar +geom_bar(position ="fill") #- apiladas al 100%p3 <- p_bar +geom_bar(position ="dodge") #- una al lado de otrap4 <- p_bar +geom_bar(position =position_dodge2(preserve ="single"))
3.9 Más elementos: Coordenadas
El sistema de coordenadas determina cómo se colocan las posiciones x e y en el plano. Casi siempre usamos el cartesiano (el de por defecto), pero hay otros
A veces necesitaremos guardar el gráfico en un fichero.
Piensa que estamos guardando la imagen, la representación del gráfico, no el objeto R.
5. Exportando gráficos
Si queremos guardar (la representación gráfica de) un gráfico en un archivo (.jpg, png, …)
Podemos usar la “Export Tab” en el Plot Pane de Rstudio. Podemos cambiar las dimensiones (anchura y altura) del gráfico.
Podemos usar la función ggsave(). Nos permite cambiar el tamaño y la resolución del gráfico. Si no le decimos qué gráfico (plot =), guarda el último que hemos dibujado
my_plot <- p +labs(title ="Mi gráfico")ggsave("my_plot.png", plot = my_plot, width =8, height =6, units ="in", dpi ="retina")
Si queremos guardar una copia completa del gráfico, no de su representación visual, sino del objeto R, podemos hacerlo con saveRDS().
saveRDS(my_plot, "my_plot.rds")
8. Asistentes para ggplot2
Hay varios asistentes para crear o modificar gráficos ggplot a través de interfaces gráficas.
Por ejemplo: ggThemeAssist, esquisse y ggannotate
8. Asistentes para ggplot2
Hay varios asistentes para crear o modificar gráficos ggplot a través de interfaces gráficas. Por ejemplo: [ggThemeAssist], [esquisse] y [ggannotate].
El paquete ggThemeAssist (sólo funciona en RStudio, no en Positron) facilita, mediante un addin de RStudio, la edición de los detalles de un gráfico; es decir, puedes comenzar haciendo un gráfico básico en RStudio, para después usar ggThemeAssist para modificar los elementos estéticos de gráfico como títulos, leyendas, colores etc… etc…
El paquete esquisse permite crear gráficos ggplot desde cero con una interfaz gráfica: ejecuta esquisse::esquisser(iris), haz el gráfico arrastrando variables y copia el código que genera.
El paquete ggannotate permite crear anotaciones en gráficos ggplot.