Conclusioni e Q&A

Riepilogo del Corso - Data Visualization con ggplot2

Marco Chiapello

Il Nostro Viaggio in ggplot2

Cosa abbiamo imparato:

Giorno 1: Fondamenti

  1. Introduzione - Filosofia ggplot2
  2. Gestione Tabelle - tidyverse workflow
  3. Grammar of Graphics - Framework teorico
  4. Geometrie Base - point, line, bar, histogram
  5. Estetiche - color, fill, size, shape, alpha
  6. Recap - Consolidamento concetti

Giorno 2: Avanzato

  1. Facets & Coordinate - Small multiples
  2. Scale & Trasformazioni - Controllo fine
  3. Temi - Personalizzazione completa
  4. Visualizzazioni Avanzate - patchwork, ggrepel, heatmaps
  5. Conclusioni - Best practices

Concetti Chiave da Ricordare

La Grammar of Graphics

I Componenti Essenziali:

  1. Data - Il dataset tidy
  2. Aesthetics - Mappature (x, y, color, …)
  3. Geometries - Rappresentazione visiva
  4. Scales - Controllo mappature
  5. Facets - Small multiples
  6. Coordinates - Sistemi di riferimento
  7. Themes - Aspetto non-dati

Formula base:

ggplot(data, aes(x, y, ...)) +
  geom_*() +
  scale_*() +
  facet_*() +
  coord_*() +
  theme_*()

Layer by Layer

ggplot2 costruisce grafici per strati successivi. Ogni + aggiunge un elemento.

Separazione Dati/Estetica

  • Dati → Geometrie/Scale (il cosa)
  • Aspetto → Temi (il come)

Questa separazione permette riproducibilità e flessibilità!

Mapping vs Setting

Mapping (dentro aes()):

# Dipende DAI DATI
ggplot(mpg, aes(
  x = displ,
  y = hwy,
  color = class,  # varia per gruppo
  size = cyl      # varia per valore
)) +
  geom_point()
  • Crea legende automatiche
  • Scala automatica
  • Valore diverso per ogni osservazione

Setting (fuori aes()):

# Valore FISSO
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(
    color = "blue",   # tutti blu
    size = 3,         # tutti size 3
    alpha = 0.6       # tutti trasparenti
  )
  • Nessuna legenda
  • Stesso valore per tutte le osservazioni
  • Personalizzazione estetica

Warning

Errore comune: Mettere valori fissi dentro aes() crea legende inutili!

Workflow Ottimale

Processo iterativo per creare grafici efficaci:

1. Prepara i Dati

  • Import con readr
  • Manipola con dplyr
  • Formato tidy (long)
  • Controlla tipi variabili

2. Esplora con ggplot2

  • Inizia semplice (geom_point())
  • Aggiungi aesthetic mappings
  • Prova diverse geometrie
  • Identifica pattern

3. Raffina

  • Aggiungi scale appropriate
  • Usa facets se necessario
  • Applica trasformazioni
  • Gestisci overplotting

4. Personalizza

  • Scegli tema appropriato
  • Customizza con theme()
  • Labels chiari e completi
  • Colori accessibili (viridis)

Best Practices Essenziali

Principi di Design

1. Chiarezza Prima di Tutto

  • Un messaggio per grafico
  • Labels completi e leggibili
  • Font size adeguato (≥ 10pt)
  • Evita 3D e effetti inutili

2. Colori Accessibili

# Preferisci viridis
scale_color_viridis_d()
scale_fill_viridis_c()

# ColorBrewer per discrete
scale_color_brewer(palette = "Set2")
  • Friendly per daltonici
  • Funziona in B/N
  • Percettualmente uniforme

3. Aspect Ratio Appropriato

  • Banking to 45° per trend
  • Quadrato per scatter con x≈y
  • Wide per time series

4. Gestione Overplotting

# Strategia 1: alpha
geom_point(alpha = 0.3)

# Strategia 2: jitter
geom_jitter()

# Strategia 3: bin2d/hex
geom_hex()

# Strategia 4: facets
facet_wrap(~ group)

Scelta della Geometria

Guida rapida per tipo di dato:

Obiettivo Tipo Dati Geometria Quando Usare
Relazione 2 continue geom_point(), geom_smooth() Correlazioni, scatter
Distribuzione 1 continua geom_histogram(), geom_density() Esplorare forma distribuzione
Comparazione Continua + Categorica geom_boxplot(), geom_violin() Confrontare gruppi
Conteggi Categorica geom_bar(), geom_col() Frequenze, totali
Evoluzione Tempo + Valore geom_line(), geom_area() Time series, trend
Composizione Parti di un tutto geom_col(position="fill") Proporzioni nel tempo
Multidimensionale Matrice valori geom_tile() (heatmap) Gene expression, correlazioni

Tip

Quando in dubbio, inizia con geom_point() per esplorare!

Codice Riproducibile

Best Practices per Script:

# 1. Header informativo
# Titolo: Analisi MPG Dataset
# Autore: Marco Chiapello
# Data: 2025-10-28
# Scopo: Esplorare relazione mpg-displ

# 2. Setup esplicito
library(tidyverse)
library(patchwork)

# 3. Import dati documentato
data(mpg)
# oppure
# mpg <- read_csv("data/mpg.csv")

# 4. Commenta scelte chiave
# Uso log scale per range ampio
ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  scale_x_log10()

Salvataggio Professionale:

# 5. Salva con parametri espliciti
ggsave(
  "output/mpg_analysis.png",
  width = 8,
  height = 6,
  dpi = 300,
  bg = "white"
)

# 6. Per pubblicazioni
ggsave(
  "figures/fig1.pdf",
  width = 7,
  height = 5,
  device = cairo_pdf
)

Versionamento

Usa Git per tracciare evoluzione dei grafici!

Tecniche Avanzate Recap

Composizioni con Patchwork

Operatori intuitivi:

library(patchwork)

# Affiancati
p1 + p2

# Verticale
p1 / p2

# Layout complesso
(p1 + p2) / p3

# Con annotazioni
p1 + p2 +
  plot_annotation(
    title = "Analisi Completa",
    tag_levels = "A"
  )

Controllo fine:

# Proporzioni custom
p1 + p2 +
  plot_layout(widths = c(2, 1))

# Tema globale
(p1 + p2) &
  theme_minimal() &
  theme(legend.position = "bottom")

# Guide collettive
p1 + p2 +
  plot_layout(guides = "collect")

Tip

Operatore & applica a tutti i subplot!

Annotazioni Intelligenti

ggrepel per etichette:

library(ggrepel)

# Evita sovrapposizioni
ggplot(mtcars, aes(wt, mpg)) +
  geom_point() +
  geom_text_repel(
    aes(label = rownames(mtcars))
  )

# Solo subset
top_cars <- mtcars[mtcars$mpg > 25, ]

ggplot(mtcars, aes(wt, mpg)) +
  geom_point() +
  geom_text_repel(
    data = top_cars,
    aes(label = rownames(top_cars)),
    color = "red"
  )

Labels vs Text:

  • geom_text_repel(): solo testo
  • geom_label_repel(): box background

Controllo direzione:

geom_text_repel(
  direction = "y",  # solo verticale
  nudge_x = 0.1,
  segment.color = "grey50"
)

Warning

Etichetta solo punti rilevanti per leggibilità!

Heatmaps e Volcano Plots

Heatmaps per matrici:

# Formato long
heatmap_data <- data %>%
  pivot_longer(
    cols = -id,
    names_to = "var",
    values_to = "value"
  ) %>%
  group_by(var) %>%
  mutate(scaled = scale(value)[,1])

# Plot
ggplot(heatmap_data, 
       aes(var, id, fill = scaled)) +
  geom_tile() +
  scale_fill_gradient2(
    low = "blue",
    mid = "white",
    high = "red"
  )

Volcano plots per DEG:

# Categorizza
deg_data <- data %>%
  mutate(
    regulation = case_when(
      log2FC > 1 & padj < 0.05 ~ "Up",
      log2FC < -1 & padj < 0.05 ~ "Down",
      TRUE ~ "NS"
    )
  )

# Plot
ggplot(deg_data, 
       aes(log2FC, -log10(padj),
           color = regulation)) +
  geom_point(alpha = 0.6) +
  geom_vline(xintercept = c(-1, 1),
             linetype = "dashed") +
  geom_hline(yintercept = -log10(0.05),
             linetype = "dashed")

Risorse per Continuare

Libri Essenziali

ggplot2 Specifici:

📘 ggplot2: Elegant Graphics for Data Analysis - Hadley Wickham et al. - LA risorsa ufficiale - Teoria + pratica - Gratuito online

📗 R Graphics Cookbook - Winston Chang - Ricette pratiche - Problem-solving oriented

Workflow e Fondamenti:

📙 R for Data Science - Wickham & Grolemund - Intero workflow data science - ggplot2 integrato

📕 Fundamentals of Data Visualization - Claus Wilke - Principi di design - Non solo R - Teoria visuale

Risorse Online

Documentazione:

🔗 ggplot2.tidyverse.org - Documentazione ufficiale - Reference completa - Esempi per ogni funzione

🔗 R Graph Gallery - 400+ esempi - Codice copy-paste - Organizzato per tipo

🔗 ggplot2 Extensions - Lista pacchetti estensioni - Categorie specializzate - Sempre aggiornato

Community e Aiuto:

💬 RStudio Community - Forum ufficiale - Molto attivo - Esperti disponibili

💬 Stack Overflow #ggplot2 - 50,000+ domande - Cerca prima di postare - Riproducibilità essenziale

📊 TidyTuesday - Dataset settimanali - Pratica con dati reali - Community condivisione

Cheatsheets e Quick Reference

Posit Cheatsheets:

📄 Data Visualization with ggplot2

  • 2 pagine PDF stampabili
  • Geometrie comuni
  • Scale e coordinate
  • Facets e temi

📄 Altri utili:

  • Data Transformation (dplyr)
  • Data Import (readr)
  • patchwork
  • lubridate (date/time)

Come usarli:

  1. Stampa e tieni sulla scrivania
  2. In RStudio: Help → Cheatsheets
  3. Consulta per sintassi veloce
  4. Non sostituiscono documentazione completa

Tip

Pratica Attiva

Il modo migliore per imparare:

  • Ricrea grafici che vedi
  • #TidyTuesday settimanale
  • Visualizza i TUOI dati!

Progetto Finale Suggerito

Challenge: Crea un Report Completo

Obiettivo: Applicare tutto ciò che hai imparato in un progetto integrato

Requisiti minimi:

1. Data Preparation

  • Import dataset (CSV, Excel, o API)
  • Pulizia e manipolazione (dplyr)
  • Formato tidy

2. Exploratory Analysis

  • Almeno 4 grafici diversi:
    • Distribuzione (histogram/density)
    • Relazione (scatter + smooth)
    • Comparazione (boxplot/violin)
    • Time series O heatmap

3. Advanced Features

  • Faceting con facet_wrap() o facet_grid()
  • Scale personalizzate (viridis, breaks custom)
  • Tema personalizzato O consistente
  • Composizione multi-panel (patchwork)

4. Professional Polish

  • Labels completi (title, subtitle, caption)
  • Annotazioni dove appropriato
  • Export alta qualità (300 dpi)
  • Codice ben commentato

Suggerimenti Dataset

Opzioni per il progetto:

Dataset Built-in R:

# Ricchi e vari
diamonds, mpg, msleep, 
economics, txhousing

# Accedi facilmente
data(diamonds)
?diamonds  # documentazione

TidyTuesday Archive:

Tuoi Dati:

  • Meglio ancora! Usa dati del tuo lavoro/ricerca
  • Massima motivazione
  • Risultati direttamente utili
  • Portfolio personale

Dataset Pubblici:

Domande Frequenti

FAQ Tecniche

Q: Quando usare facets vs color?

A: - Color se < 6 gruppi E confronti diretti - Facets se > 6 gruppi O pattern complessi O scale molto diverse

Q: geom_col() vs geom_bar()?

A: - geom_bar(): conta osservazioni (stat = “count”), solo x - geom_col(): usa valori y forniti (stat = “identity”), x e y

Q: Trasformazione in scale o coordinate?

A: - Scale (preferito): scale_y_log10() - trasforma PRIMA di stat - Coordinate: coord_trans(y = "log10") - trasforma DOPO rendering

Q: Come gestire warning “Removed X rows containing missing values”?

A: - Verifica: summary(data), is.na() per trovare NA - Decidi: rimuovi (na.omit()), imputa, o gestisci esplicitamente - Warning è informativo, non sempre errore!

Q: Salvo con ggsave ma risoluzione bassa?

A:

ggsave("plot.png", dpi = 300, width = 8, height = 6)  # 300 dpi per stampa!

FAQ Concettuali

Q: ggplot2 vs base R graphics?

A: ggplot2 offre: - Sintassi consistente e logica - Estetiche automatiche (legende, scale) - Temi riutilizzabili - Migliore per grafici complessi

Base R: più veloce per plot rapidissimi esplorativi

Q: Devo memorizzare tutte le funzioni?

A: NO! - Comprendi i concetti (grammar, layers) - Usa reference/cheatsheets - Google/Stack Overflow sono normali - La pratica consolida la memoria

Q: Come scegliere palette colori?

A: 1. Default: viridis (colorblind-safe) 2. Categoriche: ColorBrewer Set2, Dark2 3. Divergenti: RdBu, BrBG per dati con zero centrale 4. Custom: solo se branding/necessità specifiche

Q: Quanto tempo serve per diventare fluente?

A: - Basic plots: 2-3 settimane pratica regolare - Advanced customization: 2-3 mesi - Expert: 6-12 mesi + uso continuo

Q&A Session

Le Vostre Domande

💬

Domande? Dubbi? Curiosità?

Contatti e Follow-up

Rimaniamo in Contatto

Marco Chiapello

📧 Email: chiapello.m@gmail.com

🐙 GitHub: @mchiapello

💼 LinkedIn: Marco Chiapello

Materiali del Corso:

🗂️ Repository: github.com/mchiapello/DataViz_2025

  • Tutti gli script
  • Datasets
  • Soluzioni esercizi
  • Slide aggiornate

REVELO Training:

💬 Slack: revelotraining.slack.com

  • Canale corso attivo
  • Supporto post-corso
  • Community learners

Feedback:

📝 Per favore, compila il questionario di valutazione del corso

Il tuo feedback ci aiuta a migliorare!

Grazie per aver partecipato!

Buona visualizzazione! 📊✨

“The simple graph has brought more information to the data analyst’s mind than any other device.”
— John Tukey