Temi e Personalizzazione in ggplot2

Hands-on Workshop

Marco Chiapello

Obiettivi della Sessione

Cosa impareremo oggi:

  • Comprendere la separazione tra dati e aspetto visivo
  • Utilizzare temi predefiniti per cambiare rapidamente lo stile
  • Padroneggiare la funzione theme() e i suoi parametri
  • Utilizzare le funzioni element_*() per personalizzare ogni dettaglio
  • Creare annotazioni complete con labs()
  • Personalizzare legende e guide
  • Salvare grafici con ggsave() in alta qualità
  • Creare e riutilizzare temi personalizzati

Approccio:

  • Prima i temi predefiniti (facile e veloce)
  • Poi la personalizzazione fine (potente e flessibile)
  • Focus su publication-ready plots

Esercizi Pratici

Struttura degli Esercizi:

📁 File: 09_themes_personalizzazione_exercises.R

30 esercizi organizzati in 6 parti:

  1. Temi Predefiniti (5 esercizi) - Esplorare theme_*() functions
  2. theme() Basics (5 esercizi) - Modificare elementi base
  3. Funzioni element_*() (5 esercizi) - Controllo fine degli elementi
  4. Labels e Titoli (5 esercizi) - labs() e annotazioni
  5. Personalizzazione Legende (5 esercizi) - Position, formatting, guides
  6. Temi Custom e Export (5 esercizi) - Creare temi riutilizzabili

💡 Suggerimento: Inizia con temi predefiniti, poi personalizza gradualmente!

Cos’è un Tema in ggplot2?

Definizione:

Un tema controlla tutti gli elementi non relativi ai dati in un grafico:

  • Colori di sfondo
  • Griglie
  • Font e dimensioni testo
  • Posizione legende
  • Bordi e margini
  • Aspetto degli assi

Separazione Fondamentale:

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

Perché è Importante:

  1. Riproducibilità: Codice invece di Photoshop
  2. Consistenza: Stesso stile per tutti i grafici
  3. Flessibilità: Cambia look con una riga di codice
  4. Professionalità: Publication-ready plots

Best Practice

Separa sempre la creazione del grafico dalla sua personalizzazione estetica. Prima focus sui dati, poi sull’aspetto!

Capitolo 1: Temi Predefiniti

theme_gray() - Il Default

Caratteristiche:

  • Sfondo grigio con griglia bianca
  • Design di Hadley Wickham
  • Ottimizzato per massimizzare la distinzione dei dati
  • È il tema di default - non serve specificarlo
library(ggplot2)

# Tema default (non serve specificare)
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(aes(color = class))

# Oppure esplicitamente
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(aes(color = class)) +
  theme_gray()

Quando usarlo:

  • Analisi esplorativa
  • Draft plots
  • Focus massimo sui dati

Filosofia del Gray Background

Lo sfondo grigio non è casuale! Aiuta a:

  • Far risaltare i colori dei dati
  • Rendere la griglia meno invasiva
  • Creare contrasto senza stancare gli occhi

Parametri base_size:

# Aumenta dimensioni testo
ggplot(mpg, aes(x = class)) +
  geom_bar() +
  theme_gray(base_size = 18)

# Diminuisce tutto
ggplot(mpg, aes(x = class)) +
  geom_bar() +
  theme_gray(base_size = 8)

Tutti i temi accettano base_size, base_family, base_line_size, base_rect_size

theme_minimal() e theme_classic()

theme_minimal():

  • Sfondo bianco
  • Griglia sottile
  • Nessun bordo
  • Molto pulito e moderno
ggplot(economics, aes(x = date, y = unemploy)) +
  geom_line(color = "steelblue", size = 1) +
  theme_minimal()

# Con base_size
ggplot(economics, aes(x = date, y = unemploy)) +
  geom_line(color = "steelblue", size = 1) +
  theme_minimal(base_size = 14)

Quando usarlo:

  • Presentazioni
  • Report aziendali
  • Web graphics
  • Quando vuoi massima pulizia

theme_classic():

  • Assi neri con tick marks
  • Nessuna griglia
  • Stile “pubblicazione accademica”
  • Look tradizionale
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_point(aes(color = Species), size = 3) +
  theme_classic()

Quando usarlo:

  • Paper scientifici
  • Pubblicazioni accademiche
  • Quando la griglia distrae

Differenza Chiave

theme_minimal() = griglia + no bordi
theme_classic() = no griglia + assi tradizionali

Altri Temi Built-in

theme_bw() - Bianco e Nero

ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  theme_bw()
  • Sfondo bianco, griglia grigia, bordi neri
  • Ottimo per stampa B/N
  • Professional look

theme_void() - Nessun Elemento

ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  theme_void()
  • Rimuove tutto (assi, griglia, labels)
  • Perfetto per mappe, network graphs
  • Solo i dati, niente altro

theme_dark() - Sfondo Scuro

ggplot(diamonds, aes(x = carat, y = price)) +
  geom_point(alpha = 0.1, color = "cyan") +
  theme_dark()
  • Sfondo scuro, griglia chiara
  • Riduce affaticamento occhi
  • Ottimo per presentazioni

theme_light() - Leggero

ggplot(mpg, aes(x = class)) +
  geom_bar(fill = "steelblue") +
  theme_light()
  • Simile a minimal ma con bordi sottili
  • Via di mezzo tra minimal e bw

Adesso tocca a te!

Capitolo 2: La Funzione theme()

Anatomia di theme()

Struttura Gerarchica:

theme() controlla ~100 parametri organizzati gerarchicamente:

  • line - Tutte le linee
    • axis.line - Linee assi
    • panel.grid - Linee griglia
      • panel.grid.major - Griglia maggiore
      • panel.grid.minor - Griglia minore
  • rect - Tutti i rettangoli
    • plot.background - Sfondo plot
    • panel.background - Sfondo panel
  • text - Tutto il testo
    • axis.text - Testo assi
    • plot.title - Titolo
    • legend.text - Testo legenda

Ereditarietà: Gli elementi figli ereditano proprietà dai genitori

Esempio Base:

ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  theme(
    # Modifica solo griglia maggiore
    panel.grid.major = element_line(color = "red"),
    
    # Modifica tutto il testo
    text = element_text(size = 16),
    
    # Rimuove griglia minore
    panel.grid.minor = element_blank()
  )

Ordine di Applicazione

Prima applica tema predefinito, poi theme() per personalizzazioni:

theme_minimal() + theme(...)

Modificare Background e Panel

Background Elements:

ggplot(economics, aes(x = date, y = unemploy)) +
  geom_line() +
  theme_minimal() +
  theme(
    # Sfondo intero plot
    plot.background = element_rect(
      fill = "lightblue",
      color = "navy",
      size = 2
    ),
    
    # Sfondo area dati
    panel.background = element_rect(
      fill = "white",
      color = "black",
      size = 1
    ),
    
    # Bordo panel
    panel.border = element_rect(
      color = "darkgreen",
      fill = NA,
      size = 1.5
    )
  )

Differenza plot vs panel:

  • plot.background: Tutto il grafico (include titoli, legende)
  • panel.background: Solo l’area con i dati
  • panel.border: Bordo attorno ai dati
# Esempio chiaro della differenza
ggplot(mpg, aes(x = class)) +
  geom_bar() +
  labs(title = "Distribuzione Classi") +
  theme(
    plot.background = element_rect(fill = "yellow"),
    panel.background = element_rect(fill = "lightgreen"),
    panel.border = element_rect(
      color = "red", 
      fill = NA, 
      size = 2
    )
  )

Attenzione

fill = NA significa trasparente, non “nessun fill”!

Personalizzare Griglie

Controllo Completo delle Gridlines:

# Rimuovere tutte le griglie
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  theme_minimal() +
  theme(
    panel.grid = element_blank()
  )

# Solo griglia maggiore
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  theme_minimal() +
  theme(
    panel.grid.minor = element_blank()
  )

# Solo griglia orizzontale
ggplot(mpg, aes(x = class)) +
  geom_bar() +
  theme_minimal() +
  theme(
    panel.grid.major.x = element_blank(),
    panel.grid.minor = element_blank()
  )
# Personalizza colore e stile
ggplot(economics, aes(x = date, y = unemploy)) +
  geom_line() +
  theme_minimal() +
  theme(
    panel.grid.major = element_line(
      color = "gray70",
      size = 0.5,
      linetype = "dashed"
    ),
    panel.grid.minor = element_line(
      color = "gray90",
      size = 0.25,
      linetype = "dotted"
    )
  )

Best Practice per Griglie

  • Bar charts: Solo linee orizzontali
  • Time series: Entrambe le direzioni
  • Scatter plots: Dipende - spesso solo maggiori
  • Pubblicazioni: Spesso nessuna griglia

Adesso tocca a te!

Capitolo 3: Funzioni element_*()

element_text() - Controllo Testo

Parametri Principali:

element_text(
  family = "sans",        # Font family
  face = "plain",         # plain, bold, italic
  colour = "black",       # Colore testo
  size = 11,              # Dimensione (pt)
  hjust = 0.5,            # Align orizzontale (0-1)
  vjust = 0.5,            # Align verticale (0-1)
  angle = 0,              # Rotazione (gradi)
  lineheight = 1.2,       # Interlinea
  margin = margin(0,0,0,0) # Margini
)

Esempio Completo:

ggplot(mpg, aes(x = class, y = hwy)) +
  geom_boxplot() +
  theme_minimal() +
  theme(
    axis.text.x = element_text(
      angle = 45,
      hjust = 1,
      color = "darkred",
      size = 12,
      face = "bold"
    ),
    axis.title = element_text(
      size = 14,
      face = "bold"
    )
  )

Elementi di Testo Comuni:

  • plot.title - Titolo principale
  • plot.subtitle - Sottotitolo
  • plot.caption - Didascalia
  • axis.title.x/y - Titoli assi
  • axis.text.x/y - Labels assi
  • legend.title - Titolo legenda
  • legend.text - Testo legenda
  • strip.text - Testo facet

Esempio Ereditarietà:

ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  facet_wrap(~class) +
  theme_minimal() +
  theme(
    # Modifica TUTTO il testo
    text = element_text(
      family = "serif",
      size = 14
    ),
    # Override solo per titolo
    plot.title = element_text(
      size = 20,
      face = "bold",
      color = "navy"
    )
  )

element_line() - Controllo Linee

Parametri:

element_line(
  colour = "black",
  size = 0.5,
  linetype = 1,      # 1=solid, 2=dashed, etc
  lineend = "butt",  # butt, round, square
  arrow = NULL
)

Tipi di Linea:

# linetype può essere:
# 0 = blank, 1 = solid, 2 = dashed
# 3 = dotted, 4 = dotdash, 5 = longdash
# 6 = twodash

ggplot(economics, aes(x = date, y = unemploy)) +
  geom_line() +
  theme_minimal() +
  theme(
    axis.line = element_line(
      color = "black",
      size = 1
    ),
    panel.grid.major = element_line(
      linetype = "dashed",
      color = "gray70"
    )
  )

Elementi di Linea Comuni:

  • axis.line.x/y - Linee assi
  • axis.ticks - Tick marks
  • panel.grid.major/minor - Griglie
  • legend.key - Bordo chiave legenda

Esempio con Frecce:

library(grid)

ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  theme_classic() +
  theme(
    axis.line = element_line(
      arrow = arrow(
        length = unit(0.3, "cm"),
        ends = "last"
      ),
      size = 1
    )
  )

Rimuovere Tick Marks

theme(
  axis.ticks = element_blank()
)

Utile con theme_minimal()

element_rect() - Controllo Rettangoli

Parametri:

element_rect(
  fill = NA,         # Colore riempimento
  colour = NA,       # Colore bordo
  size = 0.5,        # Spessore bordo
  linetype = 1       # Tipo linea bordo
)

Elementi Rettangolari:

  • plot.background - Sfondo intero
  • panel.background - Sfondo panel
  • panel.border - Bordo panel
  • legend.background - Sfondo legenda
  • legend.key - Background chiavi legenda
  • strip.background - Sfondo facet labels

Esempio:

ggplot(mpg, aes(x = class, fill = class)) +
  geom_bar() +
  theme_minimal() +
  theme(
    panel.background = element_rect(
      fill = "white",
      color = "black",
      size = 1
    ),
    legend.background = element_rect(
      fill = "gray95",
      color = "black",
      size = 0.5
    )
  )

element_blank() - Rimuovere Elementi:

# Rimuove completamente un elemento
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  theme(
    panel.background = element_blank(),
    panel.grid = element_blank(),
    axis.line = element_line(color = "black")
  )

Differenze Importanti

fill vs colour:

ggplot(mpg, aes(x = class)) +
  geom_bar() +
  theme_classic() +
  theme(
    # fill = riempimento interno
    plot.background = element_rect(
      fill = "lightyellow"
    ),
    # colour = bordo
    panel.border = element_rect(
      colour = "navy",
      fill = NA,  # Trasparente!
      size = 2
    )
  )
  • fill: Colore interno del rettangolo
  • colour: Colore del bordo del rettangolo
  • fill = NA: Riempimento trasparente (ma elemento esiste)

NA vs element_blank()

Due modi diversi di “rimuovere”:

  • fill = NA o colour = NA
    → Trasparente ma elemento esiste ancora
    → Occupa spazio nel layout

  • element_blank()
    → Elemento rimosso completamente
    → Non occupa spazio

Quando usare cosa:

  • NA: Vuoi l’elemento ma trasparente
  • element_blank(): Non vuoi l’elemento affatto

Esempio pratico:

# Griglia trasparente (mantiene spazio)
theme(panel.grid = element_line(color = NA))

# Griglia rimossa completamente
theme(panel.grid = element_blank())

Adesso tocca a te!

Capitolo 4: Labels e Annotazioni

La Funzione labs()

Annotazioni Complete:

labs(
  title = "Titolo Principale",
  subtitle = "Sottotitolo descrittivo",
  caption = "Fonte dati",
  x = "Asse X",
  y = "Asse Y",
  color = "Nome Legenda",
  fill = "Nome Legenda",
  size = "Nome Legenda",
  # ... qualsiasi aesthetica
)

Esempio Completo:

ggplot(mpg, aes(x = displ, y = hwy, color = class)) +
  geom_point(size = 3, alpha = 0.7) +
  labs(
    title = "Consumo Carburante vs Cilindrata",
    subtitle = "Dati EPA per veicoli 1999-2008",
    caption = "Fonte: EPA fuel economy data",
    x = "Cilindrata motore (litri)",
    y = "Consumo autostrada (mpg)",
    color = "Classe\nVeicolo"
  ) +
  theme_minimal()

Formattazione Titoli:

ggplot(economics, aes(x = date, y = unemploy/1000)) +
  geom_line(color = "steelblue", size = 1) +
  labs(
    title = "Disoccupazione USA",
    subtitle = "1967-2015",
    y = "Disoccupati (migliaia)",
    x = NULL,  # Rimuove label
    caption = "Dati: Federal Reserve Economic Data"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(
      size = 20,
      face = "bold",
      hjust = 0  # Allinea a sinistra
    ),
    plot.subtitle = element_text(
      size = 14,
      color = "gray40"
    ),
    plot.caption = element_text(
      size = 9,
      hjust = 1,  # Allinea a destra
      face = "italic"
    )
  )

A Capo nei Labels

Usa \n per andare a capo:

x = "Prima riga\nSeconda riga"

Tag e Annotazioni Avanzate

plot.tag per Panel Labels:

# Utile per figure multi-panel
p <- ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  labs(tag = "A") +
  theme_minimal() +
  theme(
    plot.tag = element_text(
      size = 20,
      face = "bold"
    ),
    plot.tag.position = c(0.05, 0.95)
  )

Rimuovere Labels:

# x = NULL rimuove titolo asse
ggplot(mpg, aes(x = class)) +
  geom_bar() +
  labs(
    x = NULL,  # No titolo X
    y = "Conteggio"
  )

# color = NULL rimuove titolo legenda
ggplot(mpg, aes(x = displ, y = hwy, 
                color = class)) +
  geom_point() +
  labs(color = NULL)

Sostituire Tutti i Labels:

# ggtitle(), xlab(), ylab() - shortcut
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  ggtitle("Titolo") +
  xlab("Asse X") +
  ylab("Asse Y")

# Equivalente a:
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  labs(
    title = "Titolo",
    x = "Asse X",
    y = "Asse Y"
  )

Multi-line Titles con expression():

ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  labs(
    title = expression(
      paste("Consumo vs Cilindrata (", R^2, ")")
    )
  )

Best Practice

Usa sempre labs() invece di modificare direttamente i nomi delle variabili nei dati!

Adesso tocca a te!

Capitolo 5: Personalizzazione Legende

Posizione e Layout Legende

legend.position:

# Posizioni predefinite
theme(legend.position = "right")   # Default
theme(legend.position = "left")
theme(legend.position = "top")
theme(legend.position = "bottom")
theme(legend.position = "none")    # Nasconde

# Coordinate precise (0-1, 0-1)
ggplot(mpg, aes(x = displ, y = hwy, 
                color = class)) +
  geom_point(size = 3) +
  theme_minimal() +
  theme(
    legend.position = c(0.85, 0.75),
    legend.background = element_rect(
      fill = "white",
      color = "black"
    )
  )

legend.justification:

# Controlla quale parte della legenda
# si posiziona al punto specificato
theme(
  legend.position = c(1, 1),
  legend.justification = c(1, 1)
)
# Angolo top-right della legenda
# nell'angolo top-right del plot

legend.direction:

# Layout orizzontale
ggplot(mpg, aes(x = displ, y = hwy, 
                color = class)) +
  geom_point() +
  theme_minimal() +
  theme(
    legend.position = "bottom",
    legend.direction = "horizontal"
  )

# Layout verticale (default)
theme(legend.direction = "vertical")

legend.box:

# Quando hai più legende
ggplot(mpg, aes(x = displ, y = hwy, 
                color = class, size = cyl)) +
  geom_point(alpha = 0.6) +
  theme_minimal() +
  theme(
    legend.box = "horizontal",  # Side-by-side
    # oppure "vertical"
    legend.box.just = "top"
  )

Multiple Legende

Usa legend.box per controllare il layout quando hai più di una estetica mappata.

Formattazione Testo e Sfondo Legenda

Elementi Testo:

ggplot(mpg, aes(x = displ, y = hwy, color = class)) +
  geom_point(size = 3) +
  labs(color = "Classe Veicolo") +
  theme_minimal() +
  theme(
    # Titolo legenda
    legend.title = element_text(
      size = 14,
      face = "bold",
      color = "navy"
    ),
    
    # Labels legenda
    legend.text = element_text(
      size = 11,
      face = "italic"
    ),
    
    # Allineamento titolo
    legend.title.align = 0.5  # 0=left, 0.5=center, 1=right
  )

Elementi Background:

ggplot(mpg, aes(x = displ, y = hwy, color = class)) +
  geom_point(size = 3) +
  theme_minimal() +
  theme(
    # Sfondo legenda
    legend.background = element_rect(
      fill = "gray95",
      color = "black",
      size = 0.5
    ),
    
    # Sfondo chiavi
    legend.key = element_rect(
      fill = "white",
      color = NA
    ),
    
    # Dimensione chiavi
    legend.key.size = unit(1.5, "cm"),
    legend.key.height = unit(1, "cm"),
    legend.key.width = unit(1, "cm")
  )

Guides Avanzate

guides() - Controllo Fine:

# Personalizza guide per estetica
ggplot(mpg, aes(x = displ, y = hwy, 
                color = class, size = cyl)) +
  geom_point(alpha = 0.6) +
  guides(
    color = guide_legend(
      title = "Tipo",
      nrow = 2,
      override.aes = list(size = 4)
    ),
    size = guide_legend(
      title = "Cilindri",
      reverse = TRUE
    )
  )

guide_legend() Opzioni:

  • nrow/ncol - Righe/colonne
  • byrow - Riempimento per riga
  • reverse - Inverti ordine
  • override.aes - Modifica aesthetics nella legenda
  • title.position - “top”, “bottom”, “left”, “right”
  • label.position - Come title

guide_colorbar() per Scale Continue:

ggplot(faithfuld, aes(waiting, eruptions)) +
  geom_raster(aes(fill = density)) +
  scale_fill_viridis_c() +
  guides(
    fill = guide_colorbar(
      title = "Densità",
      barwidth = 1,
      barheight = 10,
      title.position = "top",
      title.hjust = 0.5
    )
  ) +
  theme_minimal()

Rimuovere Guide Specifiche:

# Rimuove solo color legend
guides(color = "none")

# Equivalente a:
scale_color_discrete(guide = "none")

Override Aesthetics

override.aes è perfetto per rendere le chiavi della legenda più visibili quando i punti nel plot sono piccoli o trasparenti.

Adesso tocca a te!

Capitolo 6: Temi Custom e Export

Creare Temi Riutilizzabili

Definire un Tema Custom:

# Crea funzione tema
theme_mio <- function(base_size = 12) {
  theme_minimal(base_size = base_size) +
    theme(
      # Griglia
      panel.grid.minor = element_blank(),
      panel.grid.major = element_line(
        color = "gray90",
        size = 0.5
      ),
      
      # Testo
      plot.title = element_text(
        size = base_size * 1.5,
        face = "bold",
        hjust = 0,
        margin = margin(b = 10)
      ),
      
      plot.subtitle = element_text(
        size = base_size * 1.1,
        color = "gray40",
        margin = margin(b = 15)
      ),
      
      # Assi
      axis.title = element_text(
        size = base_size * 1.1,
        face = "bold"
      ),
      
      # Legenda
      legend.position = "top",
      legend.title = element_blank()
    )
}

Usare il Tema:

# Applica a singolo plot
ggplot(mpg, aes(x = displ, y = hwy, 
                color = class)) +
  geom_point(size = 3) +
  labs(
    title = "Consumo vs Cilindrata",
    subtitle = "Dati EPA"
  ) +
  theme_mio()

# Con base_size diverso
ggplot(mpg, aes(x = class)) +
  geom_bar() +
  theme_mio(base_size = 16)

Impostare come Default:

# Per tutta la sessione
theme_set(theme_mio())

# Ora tutti i plot usano theme_mio
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point()

# Reset a default
theme_set(theme_gray())

Organizzazione

Salva i tuoi temi in un file R separato e caricalo con source("my_themes.R")

Salvare Grafici con ggsave()

Sintassi Base:

p <- ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  theme_minimal()

# Salva ultimo plot
ggsave("mio_plot.png")

# Salva plot specifico
ggsave("mio_plot.png", plot = p)

# Specifica dimensioni
ggsave(
  "mio_plot.png",
  plot = p,
  width = 8,
  height = 6,
  units = "in"  # "in", "cm", "mm"
)

Formati Supportati:

ggsave("plot.png")   # PNG (default)
ggsave("plot.pdf")   # PDF vettoriale
ggsave("plot.svg")   # SVG vettoriale
ggsave("plot.eps")   # EPS per LaTeX
ggsave("plot.jpg")   # JPEG
ggsave("plot.tiff")  # TIFF

Risoluzione e DPI:

# Alta risoluzione per pubblicazioni
ggsave(
  "plot_highres.png",
  plot = p,
  width = 8,
  height = 6,
  dpi = 300  # Standard pubblicazioni
)

# Bassa risoluzione per web
ggsave(
  "plot_web.png",
  plot = p,
  width = 800,
  height = 600,
  units = "px",
  dpi = 72
)

Controllo Background:

# Sfondo trasparente
ggsave(
  "plot_transparent.png",
  plot = p,
  bg = "transparent"
)

# Sfondo bianco
ggsave(
  "plot_white.png",
  plot = p,
  bg = "white"
)

DPI per Pubblicazioni

  • 300 DPI: Pubblicazioni scientifiche
  • 150 DPI: Presentazioni
  • 72-96 DPI: Web/schermo

Pacchetti di Temi Esterni

ggthemes - Temi Classici:

library(ggthemes)

# Economist style
ggplot(mpg, aes(x = displ, y = hwy, color = class)) +
  geom_point(size = 3) +
  theme_economist() +
  scale_color_economist()

# Wall Street Journal
ggplot(mpg, aes(x = class)) +
  geom_bar() +
  theme_wsj()

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

# Altri: theme_tufte(), theme_excel(), 
#        theme_stata(), theme_solarized()

hrbrthemes - Temi Moderni:

library(hrbrthemes)

# Modern minimal
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  theme_ipsum()

# Con font Roboto Condensed
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  theme_ipsum_rc()

# Dark theme
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(color = "white") +
  theme_ft_rc()

cowplot - Scientific:

library(cowplot)

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

Installazione

install.packages(c("ggthemes", "hrbrthemes", "cowplot"))

Alcuni richiedono font aggiuntivi installati sul sistema.

Best Practices - Parte 1

1. Workflow Consigliato:

  1. Crea il plot base (dati + geom + scale)
  2. Applica tema predefinito
  3. Personalizza con theme()
  4. Aggiungi labels con labs()
  5. Sistema legende con guides()
  6. Salva con ggsave()

2. Separazione Responsabilità:

# ✅ GIUSTO: Separa dati e aspetto
p_base <- ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(aes(color = class))

p_styled <- p_base +
  theme_minimal() +
  labs(title = "Mio Plot")

# ❌ SBAGLIATO: Tutto insieme
ggplot(mpg, aes(...)) + geom_point(...) + 
  theme(...) + scale_x_continuous(...) +
  guides(...) + labs(...)

3. Riusabilità:

# Crea tema aziendale
theme_company <- function() {
  theme_minimal() +
    theme(
      plot.title = element_text(
        color = "#003366",
        face = "bold"
      ),
      # ... altri parametri
    )
}

Organizzazione Codice

  • Salva temi custom in file separato
  • Carica con source("my_themes.R")
  • Versiona con git per tracking
  • Documenta parametri personalizzabili

Best Practices - Parte 2

4. Pubblicazioni Scientifiche:

  • Usa theme_classic() o theme_bw()
  • Rimuovi background colors
  • DPI = 300 minimo
  • Formato PDF o TIFF
  • Font leggibili (size ≥ 10)

5. Presentazioni:

  • Font grandi (base_size = 16-20)
  • Colori ad alto contrasto
  • Rimuovi elementi non essenziali
  • theme_minimal() o theme_void()

6. Web/Digital:

  • DPI = 72-96
  • PNG con sfondo trasparente
  • Dimensioni in pixel (800x600, 1200x800)
  • Colori web-safe

7. Accessibilità:

# Usa scale adatte a daltonici
scale_color_viridis_d()
scale_fill_brewer(palette = "Set2")

# Font leggibili
theme(text = element_text(size = 12))

# Contrasto sufficiente
# Evita rosso/verde come unica distinzione

Golden Rules

  1. Consistenza: Stesso tema per tutti i grafici di un progetto
  2. Semplicità: Less is more - rimuovi elementi non necessari
  3. Leggibilità: Testo sempre leggibile, anche in stampa
  4. Colori: Accessibili a tutti (inclusi daltonici)

Risorse & Prossimi Passi

Documentazione:

Cheat Sheets:

Pacchetti Utili:

  • ggthemes - Temi classici (Economist, WSJ, Tufte)
  • hrbrthemes - Temi moderni typography-focused
  • cowplot - Temi scientifici
  • thematic - Temi automatici da RStudio theme

Prossima Sessione:

  • Visualizzazioni Avanzate - Combina tutto quello che hai imparato!
  • Estensioni ggplot2 (patchwork, ggheatmap, ggraph)

Pratica Consigliata:

  1. Crea il tuo tema personale
  2. Ricrea il look di una pubblicazione che ti piace
  3. Esporta grafici in formati diversi
  4. Sperimenta con pacchetti di temi esterni

Continua a Imparare

Prova a combinare tutto ciò che hai imparato creando un grafico completo con dati personalizzati, tema custom, e esportalo in alta qualità!