HW 06 - ggplot2, estensioni, grafici interattivi e animati

Data di consegna: giovedì 5 novembre 2026

Introduzione

Il compito torna sui dati del sistema bibliotecario cittadino dell’esercitazione 1 e li rappresenta con gli strumenti visti questa settimana. È diviso in quattro parti:

  • nella Parte 1 costruirai con ggplot2 i principali grafici per una o due variabili, ragionando sulla logica dei layer
  • nella Parte 2 userai alcune estensioni di ggplot2, tra cui una a tua scelta dal portale ggplot2 extensions
  • nella Parte 3 renderai interattivi i grafici con plotly, ggiraph, highcharter e dygraphs
  • nella Parte 4 creerai un grafico animato con gganimate

In questo compito utilizzerai i comandi utili per:

  • costruire un grafico ggplot2 sommando layer: dati, estetiche, geometrie, facet, scale, etichette e temi
  • combinare più grafici in un’unica figura e salvare i grafici in un file
  • esplorare il portale delle estensioni di ggplot2 e usare un package che non abbiamo visto in aula
  • creare grafici interattivi, con etichette (tooltip) e zone evidenziate al passaggio del mouse, e salvarli in file html
  • creare un grafico animato e salvarlo in un file gif

Obiettivi di apprendimento

Lo svolgimento di questo compito ti permetterà di:

  • distinguere tra associare una variabile a un’estetica (mapping) e fissare un valore (setting)
  • scegliere la rappresentazione adatta alla domanda (ad esempio barre impilate, affiancate o normalizzate)
  • leggere la documentazione di un package nuovo e usarlo sui tuoi dati
  • valutare quando un grafico interattivo o animato aggiunge informazioni rispetto a un grafico statico

Istruzioni per l’uso

  • Crea un progetto RStudio di nome hw06 (in Positron: crea una cartella hw06 e aprila con File → Open Folder) e lavora all’interno del progetto per tutto il compito.

  • All’interno della cartella del progetto crea una sottocartella dati e salva al suo interno i file dei dati dell’esercitazione 1 (utenti.csv, prestiti.xlsx e catalogo.txt), che trovi anche su Teams, allegati al compito. Crea anche una sottocartella grafici, in cui salverai i grafici interattivi e animati.

  • Rispondi ai vari punti salvando le risposte in un file R con il nome “hw06_cognome_nome.R”: ad esempio nel mio caso il nome del file sarebbe “hw06_vistocco_domenico.R”. Salva lo script nella cartella del progetto.

  • Inizia lo script con un commento che riporti titolo del compito, nome, cognome e data.

  • Per rispondere ad ogni punto inserisci un’etichetta di sezione (che puoi inserire nello script usando la combinazione di tasti CTRL/CMD + SHIFT + R) utilizzando il punto cui stai rispondendo. Ad esempio, per rispondere al punto 1 del compito, usa un’etichetta di sezione:

    # PUNTO 1 ------------------------------------------------
  • Utilizza i commenti per rispondere alle domande in cui viene chiesta un’interpretazione da parte tua: nei commenti concentrati sul significato dei risultati e sul comportamento di R, con parole tue.

  • Lo script deve essere funzionante quando si eseguono tutti i comandi con il pulsante Source. I comandi che restituiscono un errore vanno lasciati nello script ma commentati, riportando subito sotto, sempre come commento, il messaggio di errore ottenuto.

  • Rispetta le regole di stile viste in aula: nomi degli oggetti in snake case, <- per l’assegnazione, spazi attorno agli operatori e dopo le virgole, una istruzione per riga, un a capo dopo ogni pipe e dopo ogni + dei grafici ggplot2.

  • Lo script viene valutato sia in base alla correttezza del codice che in base alla qualità (stile utilizzato per rendere lo script leggibile ed ordinato).

ImportantI package necessari

Oltre ai package usati nei compiti precedenti, per questo compito servono i package ggridges, patchwork, plotly, ggiraph, highcharter, dygraphs, xts, htmlwidgets, gganimate e gifski. Installali, una sola volta, dalla console (non nello script):

install.packages(c("ggridges", "patchwork", "plotly", "ggiraph",
                   "highcharter", "dygraphs", "xts", "htmlwidgets",
                   "gganimate", "gifski"))

Nello script carica ciascun package con library() nel punto in cui lo usi per la prima volta.

Esercizi

NoteNota

Ricordati di utilizzare i commenti per le risposte aperte e di commentare i comandi che restituiscono un errore.

Inizia lo script ricostruendo le tabelle utenti, prestiti e prestiti_completo dell’esercitazione 1 con il codice seguente.

TipCodice per ricostruire le tabelle dell’esercitazione 1
library(tidyverse)
library(readxl)
library(janitor)

utenti <- read_delim("dati/utenti.csv", delim = ";") |>
  clean_names() |>
  mutate(
    categoria = replace_values(categoria, "stu" ~ "STU"),
    categoria = recode_values(categoria,
                              "STU" ~ "Studente",
                              "LAV" ~ "Lavoratore",
                              "PEN" ~ "Pensionato",
                              "DOC" ~ "Docente",
                              "ALT" ~ "Altro"),
    genere = replace_values(genere, "f" ~ "F"),
    genere = factor(genere, levels = c("F", "M"),
                    labels = c("Femmina", "Maschio")),
    eta = 2025 - anno_di_nascita
  )

prestiti <- read_excel("dati/prestiti.xlsx", sheet = "Prestiti 2025", skip = 3) |>
  clean_names()

catalogo <- read_tsv("dati/catalogo.txt") |>
  clean_names() |>
  rename(genere_letterario = genere)

prestiti_completo <- prestiti |>
  inner_join(utenti, by = join_by(cod_utente == id_utente)) |>
  left_join(catalogo, by = "inventario")

Parte 1: Grafici con ggplot2

  1. Disegna con ggplot2 il diagramma a barre degli utenti per categoria in due modi: partendo dalla tabella utenti con geom_bar e partendo dal risultato di tabyl(utenti, categoria) con geom_col. Spiega la differenza tra i due layer geometrici

  2. Migliora il grafico del punto 1: barre orizzontali ordinate per frequenza, un colore di riempimento a tua scelta, un titolo e le etichette degli assi. Salva il grafico in un oggetto g_categorie, che userai nella Parte 2

TipSuggerimento

Per ottenere barre orizzontali basta assegnare la variabile all’estetica y invece che a x. La funzione fct_infreq del package forcats (caricato con il tidyverse) ordina le modalità di una variabile qualitativa dalla più frequente alla meno frequente. Titolo ed etichette si impostano con il layer labs().

  1. Costruisci la tabella prestiti_validi, con i soli prestiti di prestiti_completo per cui il genere letterario non è mancante. Rappresenta la distribuzione dei prestiti per categoria dell’utente e genere letterario con un diagramma a barre, usando il genere letterario come colore di riempimento. Disegna il grafico con i tre valori dell’argomento position di geom_bar: "stack" (il default), "dodge" e "fill". A quale tabella costruita con tabyl e adorn_percentages corrisponde il grafico con position = "fill"? Costruiscila e salva il grafico con position = "fill" in un oggetto g_composizione
TipSuggerimento

Puoi salvare la parte comune del grafico in un oggetto (ad esempio g <- ggplot(...)) e aggiungere ogni volta un layer diverso: g + geom_bar(position = "dodge").

  1. Disegna l’istogramma dell’età degli utenti con classi di ampiezza 5 anni, in un pannello separato per ciascuna categoria. Leggi il messaggio di avvertimento restituito da R e spiegalo
TipSuggerimento

In geom_histogram l’ampiezza delle classi si fissa con l’argomento binwidth. Il layer facet_wrap(vars(variabile)) divide il grafico in pannelli, uno per ciascuna modalità della variabile.

  1. Disegna i boxplot dell’età per categoria e sovrapponi i singoli valori con il layer geom_jitter(width = 0.2). Disegna il grafico due volte, invertendo l’ordine dei due layer, e commenta la differenza. Come puoi rendere visibili i punti anche quando vengono disegnati per primi?

  2. Disegna il diagramma di dispersione dell’età (asse orizzontale) e dell’anno di iscrizione (asse verticale) degli utenti in tre versioni: con geom_point(aes(color = "blue")), con geom_point(color = "blue") e con color = categoria all’interno di aes(). Spiega le differenze tra le tre versioni

  3. Costruisci la tabella prestiti_mese_bib con il numero di prestiti per biblioteca e mese, e rappresentala con un grafico a linee, con una linea di colore diverso per ogni biblioteca, i punti evidenziati e tutti i mesi sull’asse orizzontale. Che cosa mostra il grafico per il mese di agosto? Che cosa è successo davvero? Completa la tabella con le combinazioni mancanti, ridisegna il grafico e salvalo in un oggetto g_mese_bib

TipSuggerimento

count(biblioteca, mese = month(data_prestito)) conta i prestiti per biblioteca e mese, ma non crea le righe delle combinazioni senza prestiti. La funzione complete(biblioteca, mese = 1:12, fill = list(n = 0)) del package tidyr le aggiunge, con n uguale a 0. Nel grafico usa geom_line() e geom_point() con l’estetica color = biblioteca; il layer scale_x_continuous(breaks = 1:12) mostra tutti i mesi.

  1. Costruisci il grafico a linee del numero totale di prestiti per mese, un layer alla volta: salva in un oggetto p la chiamata a ggplot() e aggiungi uno dopo l’altro, riassegnando ogni volta l’oggetto, i layer per le linee, per i punti, per l’asse dei mesi, per titolo ed etichette e un tema a tua scelta (ad esempio theme_minimal()). Stampa il grafico finale e salvalo in un file prestiti_mese.png nella cartella del progetto
TipSuggerimento

La funzione ggsave("nome_file.png", grafico, width = ..., height = ...) salva un grafico ggplot2 in un file; le dimensioni sono espresse per default in pollici. Con scale_x_continuous(breaks = 1:12, labels = month.abb) sull’asse compaiono le abbreviazioni dei mesi.

  1. Confronta i grafici costruiti con le funzioni di R base nel compito precedente e quelli costruiti con ggplot2 in questa parte: quali vantaggi e svantaggi hanno i due approcci, nella tua esperienza?

Parte 2: Estensioni di ggplot2

Il portale ggplot2 extensions raccoglie i package che aggiungono a ggplot2 nuove geometrie, nuovi temi o nuove funzionalità.

  1. Con la funzione geom_density_ridges del package ggridges rappresenta la distribuzione dell’età degli utenti per categoria, con una curva di densità per ciascuna categoria, una sopra l’altra. Confronta il grafico con gli istogrammi del punto 4: che cosa si legge meglio nei due grafici?
TipSuggerimento

In geom_density_ridges la variabile quantitativa va sull’asse x e quella qualitativa sull’asse y: aes(x = eta, y = categoria).

  1. Con il package patchwork combina in un’unica figura i grafici g_categorie (punto 2) e g_composizione (punto 3), prima affiancati e poi uno sopra l’altro. Aggiungi alla figura un titolo complessivo e una lettera per ciascun grafico, e salvala in un file utenti_prestiti.png
TipSuggerimento

Con patchwork i grafici si combinano con gli operatori: g1 + g2 li affianca, g1 / g2 li mette uno sopra l’altro. Il layer plot_annotation(title = ..., tag_levels = "A") aggiunge il titolo complessivo e una lettera per ciascun grafico. La figura combinata si salva con ggsave, come un grafico ggplot2.

  1. Scegli dal portale delle estensioni un package che non abbiamo usato in aula, installalo e usalo per costruire un grafico con i dati delle biblioteche. Spiega in un commento che cosa fa il package e perché lo hai scelto

Parte 3: Grafici interattivi

In questa parte salverai ogni grafico interattivo in un file html, nella sottocartella grafici, con la funzione saveWidget del package htmlwidgets. Apri poi il file nel browser e verifica che il grafico funzioni.

TipSalvare un grafico interattivo
library(htmlwidgets)
saveWidget(grafico, "grafici/nome_del_file.html")

Oltre al file html, R crea una cartella con lo stesso nome e il suffisso _files, che contiene il codice JavaScript necessario a disegnare il grafico: per vedere il grafico servono entrambi.

  1. Rendi interattivo con la funzione ggplotly del package plotly il grafico g_mese_bib del punto 7. Che cosa succede passando il mouse su un punto? E cliccando su una biblioteca nella legenda? Rendi interattivo nello stesso modo anche il diagramma di dispersione del punto 6 con un colore per ciascuna categoria, e salvalo nel file grafici/plotly_utenti.html
TipSuggerimento

Per usare ggplotly conviene salvare prima il grafico ggplot2 in un oggetto: grafico_interattivo <- ggplotly(grafico). L’oggetto ottenuto si stampa e si salva come gli altri grafici interattivi.

  1. Con il package ggiraph costruisci una versione interattiva del grafico del punto 5: i boxplot dell’età per categoria con i singoli utenti sovrapposti. Passando il mouse su un punto deve comparire un’etichetta con il codice dell’utente, la sua età e il suo genere; inoltre devono essere evidenziati tutti gli utenti della stessa categoria. Salva il grafico nel file grafici/ggiraph_eta.html
TipSuggerimento

ggiraph fornisce le versioni interattive delle geometrie di ggplot2, con il suffisso _interactive: ad esempio geom_jitter_interactive. Le nuove estetiche tooltip (il testo dell’etichetta, che puoi costruire con paste0) e data_id (gli elementi con lo stesso valore vengono evidenziati insieme) vanno indicate all’interno di aes(). Il grafico diventa interattivo solo passandolo alla funzione girafe(ggobj = grafico).

  1. Con il package highcharter costruisci il diagramma a barre del numero di prestiti per categoria e genere letterario, partendo dalla tabella prestiti_validi del punto 3. Trasforma poi le barre in barre normalizzate, come nel grafico g_composizione del punto 3, aggiungi un titolo e salva il grafico nel file grafici/highcharter_generi.html
TipSuggerimento

hchart lavora su una tabella con le frequenze già calcolate (ad esempio con count): hchart(tabella, "column", hcaes(x = ..., y = ..., group = ...)). Le barre si normalizzano con hc_plotOptions(column = list(stacking = "percent")), il titolo si aggiunge con hc_title(text = "..."). Le funzioni hc_* si concatenano con la pipe.

  1. Con il package dygraphs rappresenta le serie mensili dei prestiti delle quattro biblioteche, a partire dalla tabella prestiti_mese_bib completata al punto 7. Aggiungi al grafico un titolo, il selettore dell’intervallo temporale e l’evidenziazione della serie su cui si trova il mouse. Salva il grafico nel file grafici/dygraphs_prestiti.html
TipSuggerimento

dygraph richiede una serie storica in formato xts, con una colonna per ciascuna serie:

  • crea una variabile con la data del primo giorno di ciascun mese con make_date(2025, mese, 1)
  • porta la tabella in formato largo con pivot_wider, una colonna per biblioteca
  • crea la serie con xts(colonne_delle_serie, order.by = colonna_delle_date)

Il selettore dell’intervallo si aggiunge con dyRangeSelector(), l’evidenziazione con dyHighlight().

Parte 4: Grafici animati

  1. Costruisci la tabella prestiti_cumulati, che aggiunge a prestiti_mese_bib il numero di prestiti di ciascuna biblioteca dall’inizio dell’anno fino a ciascun mese. Rappresenta l’andamento dei prestiti cumulati con un grafico animato costruito con gganimate: il tipo di grafico e di transizione sono a tua scelta, ma il titolo deve indicare il mese rappresentato in ciascun fotogramma. Salva l’animazione nel file grafici/prestiti_cumulati.gif e spiega in un commento le tue scelte
TipSuggerimento

I prestiti cumulati si calcolano con la funzione cumsum, separatamente per ciascuna biblioteca (group_by) e con i mesi in ordine (arrange). Alcune possibilità per il grafico:

  • barre per biblioteca che crescono mese dopo mese: transition_states(mese), con {closest_state} nel titolo
  • linee che si allungano nel tempo: transition_reveal(mese), con {frame_along} nel titolo

L’animazione si salva con anim_save("grafici/prestiti_cumulati.gif") subito dopo averla mostrata.

  1. ★ (facoltativo) Scegli uno dei grafici delle Parti 3 e 4 e miglioralo liberamente, anche con l’aiuto di un assistente AI: ad esempio etichette in italiano, colori, titoli, informazioni aggiuntive nelle etichette. Se usi un assistente AI, riporta in un commento il prompt utilizzato e spiega quali modifiche hai accettato e quali no

Consegna

Per inviare la tua soluzione carica su Teams, in risposta al compito assegnato:

  • il file hw06_cognome_nome.R
  • la cartella grafici compressa in un file hw06_grafici_cognome_nome.zip, con i file html (e le relative cartelle _files) e la gif

Valutazione

Totale punti disponibili: 110 punti

Component Punti
Es 1 - 17 100
Es 18 (facoltativo) -
Workflow & formattazione 101

Footnotes

  1. La valutazione al “Workflow & formattazione” tiene conto del rispetto delle regole di stile e del principio di riproducibilità del codice: lo script caricato deve funzionare senza errori su qualunque PC, eseguendolo con Source in una sessione con workspace vuoto e con i file dei dati nella sottocartella dati del progetto, dando gli stessi risultati↩︎