Hands-on Workshop
Cosa impareremo oggi:
scalesApproccio:
Scarica il file esercizi: 08_scale_trasformazioni_exercises.R
30 esercizi organizzati in 6 parti:
Approccio suggerito:
Definizione:
Le scale mappano i dati alle proprietà visive (estetiche).
Ruolo cruciale:
Ogni aesthetic ha una scala:
x, y → posizionicolor, fill → colorisize → dimensionishape → formealpha → trasparenzaDefault automatici:
ggplot2 sceglie scale sensate basandosi sul tipo di dati:
scale_*_continuous()scale_*_discrete()scale_*_binned()Regola d’oro
Ogni aesthetic mappato ottiene automaticamente una scala. Puoi sostituirla esplicitamente con scale_*_*().
Naming convention
scale_<aesthetic>_<type>() dove:
<aesthetic> = x, y, color, fill, size…<type> = continuous, discrete, manual, gradient, brewer…Parametri principali:
scale_x_continuous(
name = "Titolo asse",
breaks = seq(0, 100, 20),
labels = c("0", "20", "40", "60", "80", "100"),
limits = c(0, 100),
expand = expansion(mult = c(0, 0.05))
)name: titolo dell’asse
breaks: dove posizionare tick marks
labels: cosa mostrare ai tick marks
limits: range min-max
expand: padding ai bordi
Esempio pratico:
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
scale_x_continuous(
name = "Cilindrata (L)",
breaks = 2:7
) +
scale_y_continuous(
name = "Consumo autostrada (mpg)",
limits = c(10, 45)
)Breaks automatici
ggplot2 calcola breaks sensati. Usa breaks = waiver() per ripristinare default dopo modifica.
Con coordinate (ZOOM):
ggplot(mpg, aes(x = class, y = hwy)) +
geom_boxplot() +
coord_cartesian(ylim = c(10, 30))
# Mantiene tutti i dati!Dati fuori limite rimangono, solo non vengono mostrati. Statistiche corrette.
Quando usare cosa
scale_*_continuous(limits = ...): per filtrare daticoord_cartesian(xlim/ylim = ...): per zoom visivoQuasi sempre preferisci coord_cartesian()!
Labels con funzione custom:
scale_y_continuous(
labels = function(x) paste0("$", x)
)
# O con lambda function
scale_y_continuous(
labels = ~ paste0(.x, " km")
)Rimuovere labels:
Package scales
Essenziale per formattazione:
comma(), number()percent(), percent_format()dollar(), euro()date_format(), time_format()Adesso tocca a te!
Quando usare scale log:
Due approcci - risultati DIVERSI:
Transformations disponibili:
"log10", "log2", "log""sqrt", "exp""reverse""identity" (nessuna)"logit", "probit" (proporzioni)"reciprocal", "asn", "atanh"Package scales
Fornisce altre trasformazioni e permette di creare custom transformations.
Dati con zeri
log10(0) = -Inf! Con log scales, valori ≤ 0 vengono rimossi. Considera log1p (log(x + 1)) per dati con zeri.
Adesso tocca a te!
Geometrie che usano:
| Geom | color | fill |
|---|---|---|
geom_point() |
✓ | △ |
geom_line() |
✓ | |
geom_bar() |
✓ | ✓ |
geom_boxplot() |
✓ | ✓ |
geom_polygon() |
✓ | ✓ |
geom_ribbon() |
✓ | ✓ |
△ = solo con shape 21-25
ColorBrewer (RACCOMANDATO):
scale_color_brewer(palette = "Set1") # Qualitative
scale_color_brewer(palette = "Blues", direction = -1) # Sequential
scale_color_brewer(palette = "RdBu") # Divergingtype = "qual"/"seq"/"div"Viridis (ACCESSIBILE):
scale_color_viridis_d(option = "D") # Default (viridis)
scale_color_viridis_d(option = "C") # plasma
scale_color_viridis_d(option = "E") # cividis (migliore per daltonici)Manual (controllo totale):
Viridis (PREFERITO):
Perché Viridis:
Rainbow scales
MAI usare rainbow/jet!
Usa viridis invece.
Adesso tocca a te!
Size (radius scaling):
Problema: mappa valori a radius, ma occhio percepisce area. Valori grandi sembrano troppo grandi!
Size_area (PREFERITO):
Confronto:
# SBAGLIATO - radius scaling
ggplot(data, aes(size = value)) +
geom_point() +
scale_size(range = c(1, 20))
# CORRETTO - area scaling
ggplot(data, aes(size = value)) +
geom_point() +
scale_size_area(max_size = 20)Sempre usa scale_size_area()
Per dati quantitativi, quasi sempre preferisci scale_size_area() per mappatura corretta valori → percezione visiva.
Limiti di shape:
Shape 21-25 (filled):
ggplot(mpg, aes(x = displ, y = hwy,
shape = class,
fill = class)) +
geom_point(size = 3) +
scale_shape_manual(values = 21:25) +
scale_fill_brewer(palette = "Set1")Permette color + fill separati!
Adesso tocca a te!
Numeri:
library(scales)
scale_y_continuous(labels = comma) # 1,000,000
scale_y_continuous(labels = number_format(big.mark = ".", decimal.mark = ",")) # Europeo
scale_y_continuous(labels = scientific) # 1.0e+06Percentuali:
scale_y_continuous(labels = percent) # Moltiplica × 100, aggiunge %
scale_y_continuous(labels = percent_format(accuracy = 0.1)) # 12.3%Valuta:
scale_y_continuous(labels = dollar) # $1,000
scale_y_continuous(labels = dollar_format(prefix = "€", suffix = " EUR"))Date e tempi:
scale_x_date(labels = date_format("%b %Y")) # Gen 2020
scale_x_datetime(labels = date_format("%d/%m/%Y %H:%M"))
scale_x_time(labels = time_format("%H:%M"))Personalizzati:
Guide globali:
Tipi di guide:
guide_legend(): discreteguide_colorbar(): continuous colorsguide_bins(): binned colorsguide_axis(): assi customScale:
scale_*_continuous(limits = ...)coord_trans()Colore:
scale_*_gradient2()Dimensione:
scale_size()Generale:
?scale_color_brewerAdesso tocca a te!
Documentazione:
Packages utili:
scales: formattazione numeri, date, percentualiviridis: palette accessibiliRColorBrewer: palette ColorBrewercolorspace: manipolazione avanzata coloriProssima sessione:
Continua a praticare! Le scale sono fondamentali - influenzano direttamente percezione e interpretazione dei dati.

REVELO Training - Data Viz 2025