# PUNTO 1 ------------------------------------------------
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
ggplot2i 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,highcharteredygraphs - nella Parte 4 creerai un grafico animato con
gganimate
In questo compito utilizzerai i comandi utili per:
- costruire un grafico
ggplot2sommando 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
ggplot2e 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 cartellahw06e aprila con File → Open Folder) e lavora all’interno del progetto per tutto il compito.All’interno della cartella del progetto crea una sottocartella
datie salva al suo interno i file dei dati dell’esercitazione 1 (utenti.csv,prestiti.xlsxecatalogo.txt), che trovi anche su Teams, allegati al compito. Crea anche una sottocartellagrafici, 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:
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 graficiggplot2.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).
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
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.
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
Disegna con
ggplot2il diagramma a barre degli utenti per categoria in due modi: partendo dalla tabellautenticongeom_bare partendo dal risultato ditabyl(utenti, categoria)congeom_col. Spiega la differenza tra i due layer geometriciMigliora 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
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().
- Costruisci la tabella
prestiti_validi, con i soli prestiti diprestiti_completoper 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’argomentopositiondigeom_bar:"stack"(il default),"dodge"e"fill". A quale tabella costruita contabyleadorn_percentagescorrisponde il grafico conposition = "fill"? Costruiscila e salva il grafico conposition = "fill"in un oggettog_composizione
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").
- 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
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.
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?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")), congeom_point(color = "blue")e concolor = categoriaall’interno diaes(). Spiega le differenze tra le tre versioniCostruisci la tabella
prestiti_mese_bibcon 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 oggettog_mese_bib
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.
- Costruisci il grafico a linee del numero totale di prestiti per mese, un layer alla volta: salva in un oggetto
pla chiamata aggplot()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 esempiotheme_minimal()). Stampa il grafico finale e salvalo in un fileprestiti_mese.pngnella cartella del progetto
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.
- Confronta i grafici costruiti con le funzioni di R base nel compito precedente e quelli costruiti con
ggplot2in 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à.
- Con la funzione
geom_density_ridgesdel packageggridgesrappresenta 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?
In geom_density_ridges la variabile quantitativa va sull’asse x e quella qualitativa sull’asse y: aes(x = eta, y = categoria).
- Con il package
patchworkcombina in un’unica figura i graficig_categorie(punto 2) eg_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 fileutenti_prestiti.png
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.
- 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.
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.
- Rendi interattivo con la funzione
ggplotlydel packageplotlyil graficog_mese_bibdel 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 filegrafici/plotly_utenti.html
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.
- Con il package
ggiraphcostruisci 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 filegrafici/ggiraph_eta.html
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).
- Con il package
highchartercostruisci il diagramma a barre del numero di prestiti per categoria e genere letterario, partendo dalla tabellaprestiti_valididel punto 3. Trasforma poi le barre in barre normalizzate, come nel graficog_composizionedel punto 3, aggiungi un titolo e salva il grafico nel filegrafici/highcharter_generi.html
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.
- Con il package
dygraphsrappresenta le serie mensili dei prestiti delle quattro biblioteche, a partire dalla tabellaprestiti_mese_bibcompletata 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 filegrafici/dygraphs_prestiti.html
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
- Costruisci la tabella
prestiti_cumulati, che aggiunge aprestiti_mese_bibil 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 congganimate: 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 filegrafici/prestiti_cumulati.gife spiega in un commento le tue scelte
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.
- ★ (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
graficicompressa in un filehw06_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
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
datidel progetto, dando gli stessi risultati↩︎