library(tidyverse)Introducció a Ggplot2
La llibreria Ggplot2
Ggplot2 és la llibreria per a la visualització de dades per exel·lència dins de l’entorn R per la seva versatilitat i la seva lògica senzilla i eficient.
És un dels paquets que conformen l’entorn Tidyverse, de manera que segueix la seva lògica i és fàcil d’enllaçar amb altres funcions de paquets de Tidyverse.
Les funcions bàsiques
Per a elaborar una gràfica senzilla amb ggplot2 només necessitarem dues línies de codi:
ggplot(data = mpg, aes(x = displ, y = hwy)) +
geom_point()ggplot(): És la funció base i s’ha d’afegir sí o sí a l’hora de fer una gràfica. És la que estableix el llenç sobre el qual ‘dibuixarem’ la gràfica.aes(): (Aesthetics) Aquesta funció defineix la composició de la gràfica, com les variables que aniran als eixos X i Y, el color o les agrupacions, entre altres.- No sempre anira definida dins de la funció
ggplot(), també pot definir-se dins les funcionsgeom_*(). Això s’utilitza principalment quan volem incloure diversos datasets en una mateixa gràfica, per exemple, quan tenim un arxiu amb dades del 2023 i un altre del 2024 però volem una gràfica amb una línia per a cada any.
- No sempre anira definida dins de la funció
ggplot() +
geom_point(data = mpg, aes(x = displ, y = hwy))Les funcions geom_*
Segons la gràfica que volguem crear podem escollir entre diferents “geometries” (geom). Les més utilitzades són:
geom_point(): Per a elaborar scatterplots.geom_line(): Per a les gràfiques de línies/temporals.geom_bar(): Per a elaborar gràfics de barres.geom_histogram(): Per a histogrames.geom_boxplot()/geom_violin(): Per a observar les distribucions de les dades.geom_area(): Similar ageom_line()però afegint color a la base.
Per a elaborar mapes s’utilitza la funció geom_sf() de la llibreria sf, però requereix d’una adaptació prèvia de les dades, especificar la classe geoespacial de la variable amb coordenades o polígons i comptar amb un arxiu inicial amb els polígons de la zona amb la qual volguem treballar (.shp o .geojson). També hi ha llibreries d’R que compten amb aquests polígons de base, però s’han de tenir nocions prèvies de geocomputació.
- ⚠️ Cal remarcar que no totes les geometries necessitaran tenir la X i la Y definides.
Propietats
Podem agregar ‘propietats’ a cadascun dels elements visuals de la gràfica i proporcionar informació adicional o simplement millorar-ne l’estètica. Aquestes poden anar dins les funcions ggplot() o geom_*; o dins de la funció aes() segons el que necessitem.
color: Especifica un color concret (RGB) o la classificació en colors d’una variable extra. En les gràfiques de línies pintarà la línia sencera, però en les gràfiques de barres o scatterplots només pintarà el voltant de la geometria.fill: Similar acolorperò per a les geometries que tenen àrea interior.size: Principalment s’utilitza per a definir una mida específica de les geometries (sobretot punts), ja sigui amb un número fixe o la mida definida per una variable.group: Ens permet agrupar els elements d’una variable, per exemple, en una gràfica de línies podem definir què ha de ser cada línia. També accepta el número 1 com a argument.alpha: Defineix la transparència de les geometries. Els valors poden anar des de 0 a 1.
ggplot(data = mpg, aes(x = displ, y = hwy, color = class)) +
geom_point(size = 3, alpha = 0.7)Personalitzar paletes de colors
Ggplot2 compta amb nombroses funcions que ens permeten personalitzar els colors que apareixen a la gràfica. Es divideixen en dos grups: scale_fill_* (per a colorejar els arguments definits amb fill) i scale_color_* (per a definir l’argument color abans esmentat).
Alguns exemples són:
scale_color_brewer()iscale_fill_brewer()de la llibreria{RColorBrewer}. (Paletes de colors ja fetes)scale_color_viridis()iscale_fill_viridis()de la llibreria{viridisLite}. (Paletes de colors ja fetes)scale_color_manual()iscale_fill_manual()de la llibreria{ggplot2}(Som nosaltres qui hem de seleccionar els colors que voldrem utilitzar)
library(RColorBrewer)ggplot(data = mpg, aes(x = displ, y = hwy, color = class)) +
geom_point(size = 3, alpha = 0.7) +
scale_color_brewer(palette = "Set1") Facets
A vegades es dóna la necessitat de que volem posar diverses gràfiques una al costat de l’altre per a fer comparacions entre elles. És aquí quan entren les funcions facet_wrap() i facet_grid(). Aquestes funcions ens permeten elaborar múltiples gràfiques amb les mateixes característiques simultàniament.
ggplot(data = mpg, aes(x = displ, y = hwy, color = class)) +
geom_point(size = 3, alpha = 0.7) +
scale_color_brewer(palette = "Set1") +
facet_wrap(~ class) # Atenció al símbol ~ abans de posar la variable!!ggplot(data = mpg, aes(x = displ, y = hwy, color = class)) +
geom_point(size = 3, alpha = 0.7) +
scale_color_brewer(palette = "Set1") +
facet_grid(~ class) # Atenció al símbol ~ abans de posar la variable!!Temes
Ggplot2 també compta amb una gran varietat de temes preelaborats que podem utilitzar per a les nostres gràfiques.
ggplot(data = mpg, aes(x = displ, y = hwy, color = class)) +
geom_point(size = 3, alpha = 0.7) +
scale_color_brewer(palette = "Set1") +
theme_minimal()ggplot(data = mpg, aes(x = displ, y = hwy, color = class)) +
geom_point(size = 3, alpha = 0.7) +
scale_color_brewer(palette = "Set1") +
theme_classic()ggplot(data = mpg, aes(x = displ, y = hwy, color = class)) +
geom_point(size = 3, alpha = 0.7) +
scale_color_brewer(palette = "Set1") +
theme_dark()Títol, subtítol, eixos, comentaris, etc.
La funció labs() ens permet definir fàcilment el text que volem com a títol, subtítol…
ggplot(data = mpg, aes(x = displ, y = hwy, color = class)) +
geom_point(size = 3, alpha = 0.7) +
scale_color_brewer(palette = "Set1") +
theme_minimal() +
labs(
title = "Això és un títol",
subtitle = "Aquí va el subtítol",
caption = "Aquest és el peu de pàgina",
color = "Títol llegenda", # Heu d'especificar la variable de la llegenda que voleu titular
x = "Eix X (displ)",
y = "Eix Y (hwy)"
)Personalitzar temes
A banda dels temes prefabricats, podem personalitzar tots els elements de la gràfica al nostre gust amb la funció theme(). Per exemple:
library(ggtext)ggplot(data = mpg, aes(x = displ, y = hwy, color = class)) +
geom_point(size = 3, alpha = 0.7) +
scale_color_brewer(palette = "Set1") +
theme_minimal() +
labs(
title = "Això és un títol",
subtitle = "Aquí va el subtítol",
caption = "Aquest és el peu de pàgina",
color = "Títol llegenda", # Heu d'especificar la variable de la llegenda que voleu titular
x = "Eix X (displ)",
y = "Eix Y (hwy)"
) +
theme(
axis.title = element_blank(),
axis.text.x = element_text(size=10),
axis.text.y = element_text(size=10),
# Legend
legend.position = "top",
legend.title = element_blank(),
legend.spacing = unit(0.5, 'cm'),
legend.key.height= unit(0.5, 'cm'),
legend.key.width= unit(0.7, 'cm'),
legend.text = element_text(
size=10,
face = 'plain',
color = "grey10"),
plot.title.position = "plot",
plot.title = element_textbox(margin = margin(20, 0, 0, 0),
size = 20,
face = "bold",
width = unit(50, "lines")),
plot.subtitle = element_text(margin = margin(5, 0, 10, 0),
size = 14,
color = "grey15"),
plot.caption = element_textbox_simple(
face="plain",
size=11,
color="grey40",
hjust=1,
halign=1,
width = NULL,
margin=margin(10,0,0,0)),
plot.background = element_rect(color="white", fill="white"),
plot.margin = margin(10, 40, 10, 40)
)De gràfica estàtica a interactiva: Plotly
La llibreria {plotly} d’R incorpora la funció ggplotly() que permet transformar una gràfica estàtica de ggplot2 en una gràfica interactiva.
library(plotly)plot <- ggplot(data = mpg, aes(x = displ, y = hwy, color = class)) +
geom_point(size = 3, alpha = 0.7) +
scale_color_brewer(palette = "Set1") +
theme_minimal() +
labs(
title = "Això és un títol",
subtitle = "Aquí va el subtítol",
caption = "Aquest és el peu de pàgina",
color = "Títol llegenda", # Heu d'especificar la variable de la llegenda que voleu titular
x = "Eix X (displ)",
y = "Eix Y (hwy)"
) +
theme(
axis.title = element_blank(),
axis.text.x = element_text(size=10),
axis.text.y = element_text(size=10),
# Legend
legend.position = "top",
legend.title = element_blank(),
legend.spacing = unit(0.5, 'cm'),
legend.key.height= unit(0.5, 'cm'),
legend.key.width= unit(0.7, 'cm'),
legend.text = element_text(
size=10,
face = 'plain',
color = "grey10"),
plot.title.position = "plot",
plot.title = element_textbox(margin = margin(20, 0, 0, 0),
size = 20,
face = "bold",
width = unit(50, "lines")),
plot.subtitle = element_text(margin = margin(5, 0, 10, 0),
size = 14,
color = "grey15"),
plot.caption = element_textbox_simple(
face="plain",
size=11,
color="grey40",
hjust=1,
halign=1,
width = NULL,
margin=margin(10,0,0,0)),
plot.background = element_rect(color="white", fill="white"),
plot.margin = margin(10, 40, 10, 40)
)
ggplotly(plot) # Noteu que hi ha coses que canvien, com el subtítol o el peu. Si ho volem afegir, ho haurem de fer directament amb funcions de {plotly}.