I verbi a due tabelle sono funzioni della libreria dplyr, automaticamente caricata quando si carica tidyverse. Per mostrare il funzionamento di questi verbi carico quest’ultimo package unitamente al package readxl che sfrutto per leggere i dati utilizzati per l’esempio.
# carico le librerie di lavoro --------------------------------------------library(tidyverse) # per le funzioni di dyplr e ggplot2
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ ggplot2 3.5.1 ✔ tibble 3.2.1
✔ lubridate 1.9.3 ✔ tidyr 1.3.1
✔ purrr 1.0.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(janitor) # per la funzione clean_names
Attaching package: 'janitor'
The following objects are masked from 'package:stats':
chisq.test, fisher.test
library(gapminder) # per la tabella dati utilizzatalibrary(ggthemes) # per aggiungere altri temi grafici a ggplot2
La tabella dati gapminder
La tabella data utilizzata per mostrare il funzionamento del sistema grafico ggplot2 è la tabella gapminder, famosa per la presentazione di Hans Rosling: “The best stats you’ve ever seen” che ti invito a vedere per avere un’idea di come l’animazione può essere un utile strumento per miglirare la visualizzazione dei dati.
Un’informazione sulla tabella è disponbile consultando l’help:
# la funzione ggplot crea il primo layer (strato) di un grafico, ovvero la# scelta della tabella data in cui ci sono le variabili oggetto da rappresentareggplot(data = gap_data_2007)
# comando equivalente (sfruttando la sintassi di chiamata per nome)ggplot(gap_data_2007)
# la funzione ggplot crea il primo layer (strato) di un grafico, ovvero la# scelta della tabella data in cui ci sono le variabili oggetto da rappresentareggplot(data = gap_data_2007)
# comando equivalente (sfruttando la sintassi di chiamata per nome)ggplot(gap_data_2007)
Il layerAesthetics
# l'associazione delle variabili con le componenti di un grafico (assi, colore,# dimensione, ecc.) avviene sfruttando la funzione aes# associo la variabile price all'asse delle ascisse (asse orizzontale)ggplot(data = gap_data_2007) +aes(x = life_exp)
# la funzione aes può essere utilizzata direttamente anche all'interno della# funzione iniziale ggplot (così come all'interno degli strati successivi)ggplot(data = gap_data_2007, aes(x = life_exp))
# qui associo la variabile price all'asse delle ordinate (asse verticale)ggplot(data = gap_data_2007) +aes(y = life_exp)
# qui associo una variabile all'asse X ed una variabile all'asse Yggplot(data = gap_data_2007) +aes(x = gdp_per_cap, y = life_exp)
# per ottenere una rappresentazione grafica compiuta è necessario scegliere# l'oggetto geometrico che verrà utilizzato: la scelta dipende sia dal tipo# di variabile da rappresentare che dal tipo di grafico desiderato
Il layerGeometries
# un diagramma a barre (variabile qualitativa)ggplot(data = gap_data_2007) +aes(x = continent) +geom_bar()
# un diagramma di dispersione (due variabili numeriche)ggplot(data = gap_data_2007) +aes(x = gdp_per_cap, y = life_exp) +geom_point()
# aggiungo l'attributo colore per differenziare i punti in base ad una# variabile di stratificazioneggplot(data = gap_data_2007) +aes(x = gdp_per_cap, y = life_exp, color = continent) +geom_point()
# comando alternativo (equivalente in questo caso)ggplot(data = gap_data_2007) +aes(x = gdp_per_cap, y = life_exp) +geom_point(aes(color = continent))
# aggiungendo l'attributo colore nella funzione aes generale tutti gli stati# successivi lo sfrutteranno (a meno di non sovrascriverlo con la specifica di# un ulteriore attributo)
# un esempio (poco leggibile) sull'istogrammaggplot(data = gap_data_2007) +aes(x = gdp_per_cap, color = continent) +geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# poichè l'istogramma è una rappresentazione areale l'attributo colore va# va specificato usando l'argomento fillggplot(data = gap_data_2007) +aes(x = gdp_per_cap, fill = continent) +geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# in questo caso l'attribuzione del colore e del riempimento nello strato# geom_histogram sovrascrive l'attribuzione del riempimento fatto nella# funzione aes generaleggplot(data = gap_data_2007) +aes(x = gdp_per_cap, fill = continent) +geom_histogram(color ="red", fill ="blue", bins =11)
# un esempio di boxplot affiancati (variabile quantitativa vs variabile qualitativa)ggplot(data = gap_data_2007) +aes(x = continent, y = life_exp) +geom_boxplot()
# posso usare il colore per "abbellerire" un poco il graficoggplot(data = gap_data_2007) +aes(x = continent, y = life_exp, color = continent) +geom_boxplot()
# in questo caso la legenda è superflua poichè posso leggere direttamente le# modalità del colore del diamante sull'asse orizzontaleggplot(data = gap_data_2007) +aes(x = continent, y = life_exp, color = continent) +geom_boxplot(show.legend =FALSE)
# anche in questo caso il riempimento è preferibile al coloreggplot(data = gap_data_2007) +aes(x = continent, y = life_exp, fill = continent) +geom_boxplot(show.legend =FALSE)
# posso sfruttare anche più variabili qualitative insieme per ottenere# più boxplot affiancatiggplot(data = gap_data_1987_2007) +aes(x = continent, y = life_exp, fill =factor(year)) +geom_boxplot()
# stessa rappresentazione in orizzontaleggplot(data = gap_data_1987_2007) +aes(y = continent, x = life_exp, fill =factor(year)) +geom_boxplot()
# posso usare un diagramma a punti (scatter plot) anche per rappresentare# una variabile quantitativa vs una variabile qualitativaggplot(data = gap_data_2007) +aes(x = continent, y = life_exp) +geom_point()
# per evitare la sovrapposizione dei punti posso sfruttare la tecnica del# jittering (aggiunta di piccolo rumore casuale) per visualizzare meglio# le distribuzioni condizionate in giocoggplot(data = gap_data_2007) +aes(x = continent, y = life_exp) +geom_jitter()
# anche in questo caso posso "abbellire" un poco il grafico sfruttando il colore# e nascondendo la legenda (superflua anche qui)ggplot(data = gap_data_2007) +aes(x = continent, y = life_exp, color = continent) +geom_jitter(show.legend =FALSE)
# posso sovraimporre più "strati grafici" aggiungendo un altro geom_ggplot(data = gap_data_2007) +aes(x = continent, y = life_exp, color = continent) +geom_jitter(show.legend =FALSE) +geom_boxplot()
# dal grafico precedente si nota come impostando l'attributo colore nella# funzione aes principale comporta il suo utilizzo in tutti gli strati successivi# spostando l'attributo colore solo nello strato dei punti i boxplot verranno# rappresentati in nero (questo li rende più leggibili)ggplot(data = gap_data_2007) +aes(x = continent, y = life_exp) +geom_jitter(aes(color = continent), show.legend =FALSE) +geom_boxplot()
# posso cambiare la trasparenza degli oggetti grafici usando l'argomento alpha# che va da 0 (completamente trasparente) ad 1 (pieno)# impostandolo sul boxplot ottengo delle scatole più o meno trasparentiggplot(data = gap_data_2007) +aes(x = continent, y = life_exp) +geom_jitter(aes(color = continent), show.legend =FALSE) +geom_boxplot(alpha =0)
# uso qui un valore di trasparenza intermedioggplot(data = gap_data_2007) +aes(x = continent, y = life_exp) +geom_jitter(aes(color = continent), show.legend =FALSE) +geom_boxplot(alpha =0.5)
# anche in questo caso potrei sfruttare la trasparenza per rendere le scatole# visibili ma la rappresentazione precedente (con gli strati invertiti) è# sicuramente più leggibileggplot(data = gap_data_2007) +aes(x = continent, y = life_exp) +geom_boxplot() +geom_jitter(aes(color = continent), show.legend =FALSE, alpha =0.25)
# un esempio di diagramma a lineegap_data_1987_2007 |>group_by(year, continent) |>summarise(life_exp_avg =mean(life_exp)) |>ggplot() +aes(x = year, y = life_exp_avg, color = continent) +geom_line()
`summarise()` has grouped output by 'year'. You can override using the
`.groups` argument.
Il layerTheme
# lo strato theme mi permette di cambiare l'estetica del grafico a parità di# rappresentazione (font, colore di sfondo, assi, griglia, ecc.)# lo stesso grafico usando il tema minimalggplot(data = gap_data_2007) +aes(x = continent, y = life_exp) +geom_jitter(aes(color = continent), show.legend =FALSE) +geom_boxplot(alpha =0.5) +theme_minimal()
# lo stesso grafico usando il tema cleanggplot(data = gap_data_2007) +aes(x = continent, y = life_exp) +geom_jitter(aes(color = continent), show.legend =FALSE) +geom_boxplot(alpha =0.5) +theme_clean()
# lo stesso grafico usando il tema hcggplot(data = gap_data_2007) +aes(x = continent, y = life_exp) +geom_jitter(aes(color = continent), show.legend =FALSE) +geom_boxplot(alpha =0.5) +theme_hc()
Il layerFacets
# è possibile dividere le rappresentazioni grafiche per sottogruppi di# dati usando lo strato dei facets (sfaccettature)# qui si possono sfruttare due funzioni: facet_wrap e facet_grid# facet_wrap cerca di ottimizzare lo spazio disponibile nella divisione# in pannelliggplot(data = gap_data_2007) +aes(x = gdp_per_cap, y = life_exp) +geom_point() +facet_wrap(vars(continent))
# posso cambiare il numero di righe / colonne utilizzato sfruttando gli# argomenti nrow / ncolggplot(data = gap_data_2007) +aes(x = gdp_per_cap, y = life_exp) +geom_point() +facet_wrap(vars(continent), ncol =2)
# posso usare anche più di una variabile per ottenere i sottogruppi di datiggplot(data = gap_data_1987_2007) +aes(x = gdp_per_cap, y = life_exp) +geom_point() +facet_wrap(vars(continent, year))
# facet_grid utilizza una rappresentazione a griglia (righe vs colonne)ggplot(data = gap_data_1987_2007) +aes(x = gdp_per_cap, y = life_exp) +geom_point() +facet_grid(rows =vars(year), cols =vars(continent))
# ha lo svantaggio che in alcuni casi possono esserci spazi non sfruttati# (quando ci sono incroci tra righe e colonne in cui non ci sono dati)# ma ha il vantaggio di permettere la rappresentazione delle distribuzioni# marginali ("somma" di righe e colonne)ggplot(data = gap_data_1987_2007) +aes(x = gdp_per_cap, y = life_exp) +geom_point() +facet_grid(rows =vars(year), cols =vars(continent), margins =TRUE)
# lo strato dei facets può essere utilizzato per qualunque rappresentazione# grafica e usando tutte le impostazioni viste in precedenzaggplot(data = gap_data_2007) +aes(x = life_exp) +geom_histogram(bins =11, color ="red", fill ="cyan") +facet_wrap(vars(continent))
# cambio anche qui il numero di righeggplot(data = gap_data_2007) +aes(x = life_exp) +geom_histogram(bins =11, color ="red", fill ="cyan") +facet_wrap(vars(continent), nrow =5)
# i facets (facet_wrap e facet_grid) usando per default lo stesso sistema# metrico sugli assi per tutti i pannelli per favorire il confronto# questo vincolo si può rilassare sull'asse X (free_x), sull'asse Y (free_y)# o su entrambi gli assi (free) usando l'argomento scalesggplot(data = gap_data_2007) +aes(x = life_exp) +geom_histogram(bins =11, color ="red", fill ="cyan") +facet_wrap(vars(continent), scales ="free_y", nrow =5)
# in alternativa si possono sfruttare le densità di frequenza sull'asse verticale# per favorire il confronto tra rappresentazioni riferite a differenti sottogruppiggplot(data = gap_data_2007) +aes(x = life_exp, y =after_stat(density)) +geom_histogram(bins =11, color ="red", fill ="cyan") +facet_wrap(vars(continent), nrow =5)