Estetiche e Mappature in ggplot2

Hands-on Workshop

Marco Chiapello

Obiettivi della Sessione

Cosa impareremo oggi:

  • Comprendere cosa sono le estetiche (aesthetics)
  • Distinguere tra mapping e setting
  • Esplorare le estetiche principali: color, fill, size, shape, alpha
  • Applicare estetiche a diversi tipi di geom
  • Gestire scale e legende

Approccio:

  1. Teoria delle estetiche
  2. Differenza mapping vs setting
  3. Estetiche specifiche per tipo
  4. Esercizi pratici

Esercizi Pratici

Scarica il file esercizi: 05_estetiche_mappature_exercises.R

30 esercizi organizzati in 6 parti:

  1. Color Aesthetic (5 esercizi): color mapping, discrete vs continuous
  2. Fill Aesthetic (5 esercizi): fill per aree, interazione con color
  3. Size e Shape (5 esercizi): dimensione e forma dei punti
  4. Alpha (Trasparenza) (5 esercizi): gestione overplotting
  5. Mapping vs Setting (5 esercizi): differenze chiave
  6. Combinazioni Avanzate (5 esercizi): multiple aesthetics

Approccio suggerito:

  • Lavora su ogni parte in sequenza
  • Sperimenta con diverse combinazioni
  • Osserva come le scale si adattano automaticamente

Cos’è un’Estetica?

Definizione:

Le estetiche (aesthetics) sono le proprietà visive degli oggetti nel grafico.

Estetiche principali:

  • Posizione: x, y
  • Colore: color (bordi/linee), fill (riempimento)
  • Dimensione: size
  • Forma: shape
  • Trasparenza: alpha
  • Tipo di linea: linetype

Struttura:

ggplot(data, aes(x = var1, y = var2, 
                 color = var3)) +
  geom_point()

Caratteristiche:

  1. Collegano dati a proprietà visive
  2. Creano automaticamente scale appropriate
  3. Generano legende quando necessario
  4. Possono essere mappate (dipendono dai dati) o impostate (fisse)

Regola d’oro

Se vuoi che una proprietà visiva vari con i dati, mettila dentro aes(). Se vuoi un valore fisso, mettila fuori aes().

Color Aesthetic

Color: Variabili Discrete

Uso con categorie:

# Color per categoria
ggplot(mpg, aes(x = displ, y = hwy, 
                color = class)) +
  geom_point()

Caratteristiche:

  • Ogni categoria ottiene un colore distinto
  • Scala discreta automatica
  • Legenda con tutti i livelli
  • Default: palette ggplot2

Quando usare:

  • Distinguere gruppi
  • Evidenziare categorie
  • Confrontare pattern tra gruppi

Tipi di geom

color controlla colori diversi in base al geom:

  • geom_point(): colore del punto
  • geom_line(): colore della linea
  • geom_bar(): colore del bordo
  • geom_boxplot(): colore del bordo

Troppe categorie

Con >7-8 categorie, i colori diventano difficili da distinguere. Considera di:

  • Raggruppare categorie minori in “Altri”
  • Usare facets invece di color
  • Usare palette ottimizzate (viridis, ColorBrewer)

Color: Variabili Continue

Uso con valori numerici:

# Gradient di colore
ggplot(mpg, aes(x = displ, y = hwy, 
                color = cty)) +
  geom_point()

Caratteristiche:

  • Gradient continuo di colori
  • Scala continua automatica
  • Legenda con barra di colore
  • Default: blu scuro → blu chiaro

Quando usare:

  • Mostrare terza dimensione
  • Visualizzare intensità/densità
  • Heatmaps e mappe

Palette migliori

Il gradient blu di default non è sempre ottimale:

# Viridis (percettualmente uniforme)
+ scale_color_viridis_c()

# Gradient personalizzato
+ scale_color_gradient(
    low = "yellow", 
    high = "red"
  )

# Divergente (es. + e -)
+ scale_color_gradient2(
    low = "blue",
    mid = "white",
    high = "red",
    midpoint = 0
  )

Adesso tocca a te!

Fill Aesthetic

Fill: Riempimento Aree

Uso con geom ad area:

# Fill per categorie
ggplot(mpg, aes(x = class, fill = drv)) +
  geom_bar()

# Fill per densità
ggplot(mpg, aes(x = hwy, fill = drv)) +
  geom_density(alpha = 0.5)

Geom che usano fill:

  • geom_bar(), geom_col()
  • geom_histogram()
  • geom_density()
  • geom_boxplot(), geom_violin()
  • geom_polygon(), geom_ribbon()

Color vs Fill

  • color: bordo/linea
  • fill: interno/area
# Entrambi
ggplot(mpg, aes(x = class, 
                fill = class)) +
  geom_bar(color = "black")

Spesso si usa fill per gruppi e color fisso per bordi.

Scale separate

color e fill hanno scale indipendenti:

  • scale_color_*() per color
  • scale_fill_*() per fill

Fill: Gestire Trasparenza

Overlapping con alpha:

# Densità sovrapposte
ggplot(mpg, aes(x = hwy, fill = drv)) +
  geom_density(alpha = 0.3)

# Violini trasparenti
ggplot(mpg, aes(x = class, y = hwy,
                fill = class)) +
  geom_violin(alpha = 0.6)

Valori alpha:

  • alpha = 1: opaco (default)
  • alpha = 0: completamente trasparente
  • alpha = 0.3-0.7: buon range per overlap

Position adjustments

Per barre sovrapposte, usa position:

# Stacked (default)
geom_bar(position = "stack")

# Affiancate
geom_bar(position = "dodge")

# Normalizzate (100%)
geom_bar(position = "fill")

# Sovrapposte
geom_bar(position = "identity", 
         alpha = 0.5)

Adesso tocca a te!

Size e Shape

Size: Dimensione Punti

Mapping size a dati:

# Size variabile continua
ggplot(mpg, aes(x = displ, y = hwy, 
                size = cyl)) +
  geom_point()

# Bubble chart (3 variabili)
ggplot(mpg, aes(x = displ, y = hwy, 
                size = cty, color = class)) +
  geom_point(alpha = 0.6)

Caratteristiche:

  • Ottimo per terza variabile numerica
  • Scala automatica con legenda
  • Attenzione: area vs raggio

Limitazioni di size

Problemi:

  1. Difficile confrontare dimensioni precise
  2. Punti grandi possono sovrapporsi
  3. Non funziona bene con molte categorie discrete

Soluzioni:

# Controllare range
+ scale_size_continuous(range = c(1, 10))

# Usare area invece di raggio
+ scale_size_area()

# Ridurre alpha per overlap
geom_point(alpha = 0.5)

Shape: Forma Punti

Mapping shape a categorie:

# Shape per gruppi
ggplot(mpg, aes(x = displ, y = hwy, 
                shape = drv)) +
  geom_point()

# Shape + color (ridondanza utile)
ggplot(mpg, aes(x = displ, y = hwy, 
                shape = drv, color = drv)) +
  geom_point(size = 3)

Quando usare:

  • Gruppi categorici (max 6-7)
  • Accessibilità (color blindness)
  • Stampa in bianco e nero

Shape disponibili

ggplot2 ha 25 shape built-in (0-24):

  • 0-14: solo bordo (usa color)
  • 15-20: solo riempimento (usa color)
  • 21-24: bordo + riempimento (usa color + fill)
# Shape personalizzato
geom_point(shape = 21, 
           color = "black", 
           fill = "red", 
           size = 3)

Limite shape

Max ~6 shape distinguibili. Oltre, meglio usare facets.

Adesso tocca a te!

Alpha (Trasparenza)

Alpha: Gestire Overplotting

Trasparenza per densità:

# Alpha fisso (setting)
ggplot(diamonds, aes(x = carat, y = price)) +
  geom_point(alpha = 0.1)

# Alpha variabile (mapping)
ggplot(diamonds, aes(x = carat, y = price,
                     alpha = depth)) +
  geom_point()

Quando usare:

  • Overplotting: molti punti sovrapposti
  • Densità: mostrare concentrazione
  • Overlay: sovrapporre elementi

Valori alpha consigliati

Per overplotting:

  • Centinaia di punti: alpha = 0.5
  • Migliaia: alpha = 0.3
  • Decine di migliaia: alpha = 0.1
  • Centinaia di migliaia: alpha = 0.01

Per overlay:

# Linea + ribbon
geom_ribbon(alpha = 0.3) +
geom_line()

# Densità multiple
geom_density(alpha = 0.5)

Alpha: Mapping vs Setting

Setting (valore fisso):

# Tutti i punti stessa trasparenza
geom_point(alpha = 0.4)

# Utile per overplotting
ggplot(big_data, aes(x = x, y = y)) +
  geom_point(alpha = 0.1, size = 0.5)

Più comune di mapping:

  • Risolve overplotting
  • Migliora leggibilità
  • Non crea legenda aggiuntiva

Mapping (variabile):

# Alpha dipende dai dati
ggplot(data, aes(x = x, y = y, 
                 alpha = confidence)) +
  geom_point()

Quando mappare:

  • Mostrare incertezza
  • Evidenziare priorità
  • Visualizzare peso/importanza

Attenzione

Mapping alpha crea legenda, che può confondere. Spesso meglio setting fisso + altre estetiche.

Adesso tocca a te!

Mapping vs Setting

La Distinzione Fondamentale

MAPPING (dentro aes):

# Dipende dai DATI
ggplot(mpg, aes(x = displ, y = hwy,
                color = class,    # varia
                size = cyl)) +    # varia
  geom_point()
  • Proprietà varia con i dati
  • Crea scala automatica
  • Genera legenda
  • Usa nome variabile

SETTING (fuori aes):

# Valore FISSO
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(color = "blue",    # fisso
             size = 3,          # fisso
             alpha = 0.6)       # fisso
  • Proprietà costante
  • Nessuna scala
  • Nessuna legenda
  • Usa valore diretto

Errori Comuni

ERRORE 1: Setting dentro aes()

# ❌ SBAGLIATO
ggplot(mpg, aes(x = displ, y = hwy,
                color = "blue")) +
  geom_point()
# Crea variabile "blue", non blu!

ERRORE 2: Mapping fuori aes()

# ❌ SBAGLIATO
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(color = class)
# Error: object 'class' not found

CORRETTO:

# ✅ Setting corretto
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(color = "blue", size = 3)

# ✅ Mapping corretto
ggplot(mpg, aes(x = displ, y = hwy,
                color = class)) +
  geom_point(size = 3)  # size fisso OK

# ✅ Mix corretto
ggplot(mpg, aes(x = displ, y = hwy,
                color = class)) +    # mapping
  geom_point(size = 3, alpha = 0.6)  # setting

Adesso tocca a te!

Combinazioni Avanzate

Multiple Aesthetics

Combinare più estetiche:

# 4 variabili in un plot
ggplot(mpg, aes(x = displ, y = hwy,
                color = class,
                size = cyl)) +
  geom_point(alpha = 0.6)

# Con shape aggiuntivo
ggplot(mpg, aes(x = displ, y = hwy,
                color = class,
                shape = drv)) +
  geom_point(size = 3)

Benefici:

  • Visualizzare più dimensioni
  • Ridondanza utile (accessibilità)
  • Analisi multivariata

Rischio sovraccarico

Troppi aesthetic = confusione!

Linee guida:

  • Max 3-4 aesthetic mappate
  • Usa ridondanza intelligente (color + shape per stesso gruppo)
  • Considera facets invece di aesthetic aggiuntive
  • Mantieni setting (fissi) per migliorare leggibilità
# Meglio ridondante che solo shape
ggplot(mpg, aes(x = displ, y = hwy,
                color = drv,   # e
                shape = drv)) + # drv
  geom_point(size = 3)

Best Practices

Consigli per estetiche efficaci:

  1. Priorità percettiva: Posizione > Size > Color > Shape
    • Usa x/y per variabili più importanti
    • color per gruppi principali
    • size/shape per info secondarie
  2. Accessibilità:
    • Usa palette colorblind-friendly (viridis, ColorBrewer)
    • Combina color + shape per gruppi
    • Evita solo rosso/verde
  3. Chiarezza:
    • Meno è meglio: non mappare tutto
    • Setting per migliorare leggibilità (alpha, size fissi)
    • Legende chiare: rinomina se necessario
  4. Performance:
    • Con big data: alpha basso, size piccolo
    • Considera geom_hex() o geom_bin2d() invece di troppi punti

Adesso tocca a te!

Risorse & Prossimi Passi

Documentazione:

Palette utili:

  • viridis: palette percettualmente uniformi e colorblind-friendly
  • RColorBrewer: palette predefinite per diversi usi
  • ggsci: palette da pubblicazioni scientifiche

Prossima sessione:

  • Facets e coordinate: organizzare e trasformare visualizzazioni
  • Small multiples con facet_wrap() e facet_grid()
  • Sistemi di coordinate: cartesiano, polare, flip

Continua a praticare! Gli esercizi coprono casistiche reali che incontrerai nel lavoro quotidiano.