Introducció a Ggplot2

Author

Mireia Camacho

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:

library(tidyverse)
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 funcions geom_*(). 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.
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 a geom_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 a color però 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() i scale_fill_brewer() de la llibreria {RColorBrewer}. (Paletes de colors ja fetes)

  • scale_color_viridis() i scale_fill_viridis() de la llibreria {viridisLite}. (Paletes de colors ja fetes)

  • scale_color_manual() i scale_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}.