Geometrie Base in ggplot2

Hands-on Workshop

Marco Chiapello

Obiettivi della Sessione

Cosa impareremo oggi:

  • Esplorare le geometrie fondamentali di ggplot2
  • Comprendere quando usare ogni tipo di geom
  • Praticare con pesercizi su dati reali
  • Focus su aesthetics x e y (altri aesthetics: sessioni successive)

Approccio:

  1. Teoria per ogni categoria di geom
  2. Esempi pratici
  3. Esercizi guidati

Esercizi Pratici

Scarica il file esercizi: 04_geometrie_base_exercises.R

30 esercizi organizzati in 6 parti:

  1. Relazioni (6 esercizi): point, smooth, line, path
  2. Distribuzioni 1D (6 esercizi): histogram, density, freqpoly, dotplot
  3. Distribuzioni 2D (4 esercizi): bin2d, hex, density2d
  4. Statistiche (5 esercizi): boxplot, violin, bar, col
  5. Incertezza (3 esercizi): errorbar, pointrange, ribbon
  6. Combinazioni (6 esercizi): multi-layer plots

Approccio suggerito:

  • Lavora su ogni parte in sequenza
  • Confronta con soluzioni solo dopo aver provato
  • Sperimenta con parametri diversi

Cos’è una Geometria?

Definizione:

Le geometrie (geom_*) sono gli oggetti geometrici che rappresentano i dati nel grafico.

Ogni geom:

  • Interpreta i dati in modo specifico
  • Ha parametri personalizzabili
  • Può essere combinato con altri geom
  • Eredita mapping da ggplot() o definisce i propri

Struttura base:

ggplot(data, aes(x = var1, y = var2)) +
  geom_TIPO()

Categorie principali:

  1. Relazioni (scatter, line, smooth)
  2. Distribuzioni 1D (histogram, density, dotplot)
  3. Distribuzioni 2D (bin2d, hex, density2d)
  4. Statistiche riassuntive (boxplot, violin, bar)
  5. Incertezza (errorbar, linerange, ribbon)
  6. Combinazioni (multipli geom insieme)

Oggi: solo x e y

Focus esclusivo su mappature x e y. Color, size, shape, etc. → prossime sessioni.

Geoms per Relazioni

geom_point(): Scatter Plot

Quando usarlo:

  • Relazione tra due variabili continue
  • Identificare correlazioni, cluster, outlier
  • Ogni punto = una osservazione

Parametri principali:

geom_point(
  size = 2,        # dimensione punti
  alpha = 0.5,     # trasparenza (0-1)
  shape = 16       # forma (0-25)
)

Esempio:

library(ggplot2)

ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point()

Situazioni ideali:

  • ✅ Correlazioni continue
  • ✅ Dataset con centinaia/migliaia di punti
  • ✅ Esplorare pattern generali

Problemi comuni:

  • ⚠️ Overplotting: troppi punti sovrapposti
    • Soluzione: alpha basso
  • ⚠️ Punti identici nascosti
    • Soluzione: geom_jitter()

Varianti:

# Aggiunge jitter (piccolo rumore casuale)
geom_jitter(width = 0.1, height = 0.1)

# Conta punti sovrapposti
geom_count()

geom_line() & geom_path()

geom_line():

Connette punti ordinati per x

ggplot(economics, aes(x = date, y = unemploy)) +
  geom_line()

Quando usarlo:

  • Time series
  • Trend temporali
  • Dati ordinati naturalmente

Parametri:

geom_line(
  linewidth = 1,
  linetype = "solid"  # "dashed", "dotted"
)

geom_path():

Connette punti nell’ordine dei dati

ggplot(data, aes(x = x, y = y)) +
  geom_path()

Quando usarlo:

  • Traiettorie
  • Percorsi non ordinati per x
  • Dati spaziali

line vs path

  • geom_line(): ordina per x
  • geom_path(): rispetta ordine righe

geom_smooth(): Trend Lines

Aggiunge linea di trend con intervallo di confidenza

Metodi disponibili:

# LOESS - default per n < 1000 (smooth locale)
geom_smooth(method = "loess")

# Lineare
geom_smooth(method = "lm")

# GAM - General Additive Model
geom_smooth(method = "gam")

# GLM - Generalized Linear Model
geom_smooth(method = "glm")

Parametri:

geom_smooth(
  method = "lm",
  se = TRUE,      # mostra intervallo confidenza
  level = 0.95,   # livello confidenza
  formula = y ~ x # formula personalizzata
)

Esempio completo:

ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(alpha = 0.3) +
  geom_smooth(method = "lm", se = TRUE)

Quando usarlo:

  • Identificare trend generali
  • Confrontare relazioni lineari/non-lineari
  • Aggiungere a scatter plot

Attenzione

geom_smooth() non sostituisce analisi statistica formale. È uno strumento esplorativo!

Adesso tocca a te!

Distribuzioni: 1 Variabile

geom_histogram(): Istogrammi

Quando usarlo:

  • Distribuzione di 1 variabile continua
  • Vedere forma, centro, spread
  • Identificare skewness, modalità

Solo aesthetic x:

ggplot(mpg, aes(x = hwy)) +
  geom_histogram()

Parametri critici:

geom_histogram(
  bins = 30,        # numero bin
  binwidth = 2,     # larghezza bin
  fill = "blue",
  color = "black"
)

Scelta dei bins:

  • Troppo pochi: informazione persa
  • Troppi: troppo rumore
  • Default: bins = 30
  • Alternativa: Sturges rule (automatico)

Esempio:

# Sperimentare con bins
ggplot(diamonds, aes(x = carat)) +
  geom_histogram(bins = 50)

Bins vs Binwidth

Usa bins (numero) O binwidth (larghezza), mai entrambi!

geom_density(): Curve di Densità

Quando usarlo:

  • Alternativa smooth agli istogrammi
  • Confrontare distribuzioni sovrapposte
  • Enfatizzare forma distribuzione

Esempio base:

ggplot(mpg, aes(x = hwy)) +
  geom_density()

Parametri:

geom_density(
  adjust = 1,      # smoothness (default 1)
  fill = "blue",
  alpha = 0.3
)

Combinare histogram + density:

ggplot(mpg, aes(x = hwy)) +
  geom_histogram(aes(y = after_stat(density)), 
                 alpha = 0.5) +
  geom_density(color = "red", linewidth = 1)

Quando NON usarlo:

  • Dataset molto piccoli (< 20 obs)
  • Bisogno di conteggi esatti
  • Dati discreti

adjust parameter

adjust < 1: più dettaglio
adjust > 1: più smooth

geom_freqpoly() & geom_dotplot()

geom_freqpoly():

Histogram come linea (utile per sovrapposizioni)

ggplot(diamonds, aes(x = price)) +
  geom_freqpoly(bins = 50)

Vantaggi:

  • Confrontare gruppi senza occlusione
  • Più pulito di histogram sovrapposti
  • Stessi parametri di geom_histogram()

geom_dotplot():

Ogni punto = osservazione (dataset piccoli)

ggplot(faithful, aes(x = waiting)) +
  geom_dotplot(binwidth = 1)

Quando usarlo:

  • Dataset < 100 osservazioni
  • Vedere ogni singolo dato
  • Alternative: strip plot, beeswarm

Adesso tocca a te!

Distribuzioni: 2 Variabili

geom_bin2d() & geom_hex()

geom_bin2d():

Heatmap rettangolare per big data

ggplot(diamonds, aes(x = carat, y = price)) +
  geom_bin2d(bins = 50)

Quando usarlo:

  • Dataset > 10,000 punti
  • Overplotting severo
  • Identificare densità

geom_hex():

Heatmap esagonale (più efficiente)

library(hexbin)  # richiesto!

ggplot(diamonds, aes(x = carat, y = price)) +
  geom_hex(bins = 50)

Vantaggi hex:

  • Bins più uniformi
  • Tessellazione migliore
  • Più accurato per densità

Warning

Richiede install.packages("hexbin")

geom_density2d()

Contour lines per densità 2D

ggplot(faithful, aes(x = eruptions, y = waiting)) +
  geom_density2d()

Combinare con punti:

ggplot(faithful, aes(x = eruptions, y = waiting)) +
  geom_point(alpha = 0.3) +
  geom_density2d(color = "red")

Filled density:

ggplot(faithful, aes(x = eruptions, y = waiting)) +
  geom_density2d_filled()

Quando usarlo:

  • Identificare cluster
  • Distribuzioni multimodali
  • Dataset medio-grandi

Tip

geom_density2d_filled() crea heatmap smooth (no contorni)

Adesso tocca a te!

Statistiche Riassuntive

geom_boxplot() & geom_violin()

geom_boxplot():

ggplot(mpg, aes(x = class, y = hwy)) +
  geom_boxplot()

Componenti:

  • Mediana (linea centrale)
  • Q1, Q3 (box)
  • Whiskers (1.5×IQR)
  • Outliers (punti)

Parametri:

geom_boxplot(
  notch = TRUE,    # notch per CI mediana
  outlier.color = "red"
)

geom_violin():

ggplot(mpg, aes(x = class, y = hwy)) +
  geom_violin()

Vantaggi:

  • Mostra forma completa distribuzione
  • Rivela multimodalità
  • Più informativo di boxplot

Combinare entrambi:

ggplot(mpg, aes(x = class, y = hwy)) +
  geom_violin() +
  geom_boxplot(width = 0.1)

geom_bar() & geom_col()

geom_bar():

Conta automaticamente (solo x)

ggplot(mpg, aes(x = class)) +
  geom_bar()

Default stat:

geom_bar(stat = "count")  # default

Quando usarlo:

  • Contare osservazioni per categoria
  • Solo variabile categorica

geom_col():

Usa valori y esistenti

# Dati aggregati
summary_data <- mpg %>%
  group_by(class) %>%
  summarise(mean_hwy = mean(hwy))

ggplot(summary_data, aes(x = class, y = mean_hwy)) +
  geom_col()

bar vs col

  • geom_bar(): conta dati raw
  • geom_col(): usa valori pre-calcolati

Adesso tocca a te!

Incertezza

geom_errorbar() & geom_pointrange()

geom_errorbar():

# Dati con SE
summary_data <- mpg %>%
  group_by(class) %>%
  summarise(
    mean = mean(hwy),
    se = sd(hwy) / sqrt(n())
  )

ggplot(summary_data, aes(x = class, y = mean)) +
  geom_col() +
  geom_errorbar(
    aes(ymin = mean - se, ymax = mean + se),
    width = 0.2
  )

geom_pointrange():

ggplot(summary_data, aes(x = class, y = mean)) +
  geom_pointrange(
    aes(ymin = mean - se, ymax = mean + se)
  )

Alternative:

  • geom_linerange(): solo linea verticale
  • geom_crossbar(): barra orizzontale
  • geom_ribbon(): bande continue (time series)

geom_ribbon(): Bande di Confidenza

Per time series con intervalli:

# Simula dati con CI
ts_data <- economics %>%
  mutate(
    lower = unemploy - 500,
    upper = unemploy + 500
  )

ggplot(ts_data, aes(x = date, y = unemploy)) +
  geom_ribbon(aes(ymin = lower, ymax = upper),
              alpha = 0.3) +
  geom_line()

Quando usarlo:

  • Intervalli di previsione
  • Confidence/credible intervals
  • Incertezza su time series

Parametri:

geom_ribbon(
  fill = "blue",
  alpha = 0.3,      # trasparenza importante!
  color = NA        # no bordo (default)
)

Adesso tocca a te!

Combinazioni Avanzate

Combinare Geometrie

Layering multiplo:

ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(alpha = 0.3) +            # scatter
  geom_smooth(method = "lm") +         # trend lineare
  geom_rug(alpha = 0.2)                # distribuzioni marginali

Best practices:

  1. Layer più importanti in alto (disegnati per ultimi)
  2. Usa alpha per trasparenza quando sovrapponi
  3. Ordine logico: base → summaries → annotations

Esempio complesso:

ggplot(mpg, aes(x = class, y = hwy)) +
  geom_violin(fill = "lightblue", alpha = 0.5) +
  geom_boxplot(width = 0.2, fill = "white") +
  geom_jitter(alpha = 0.1, width = 0.1)

Adesso tocca a te!

Risorse & Prossimi Passi

Prossime sessioni:

  1. Aesthetics avanzate (color, size, shape, fill)
  2. Scales & Coordinate systems
  3. Faceting (small multiples)
  4. Themes & styling
  5. Annotations & labels
  6. Plot composition (patchwork)

Domande?

Usa Slack o email per supporto sugli esercizi!