HOWTO · R

Come modificare le etichette degli assi in ggplot2 con R

Modifica le etichette delle tacche su assi discreti e continui in ggplot2, applica formati e ruota i testi sovrapposti.

Usa scale_x_discrete(labels = ...) per rinominare le etichette delle tacche associate a fattori o stringhe. Per un asse numerico, scale_x_continuous(breaks = ..., labels = ...) imposta posizioni e formato. La rotazione e gli altri cambiamenti visivi appartengono invece a theme(axis.text.x = element_text(...)). Per cambiare il titolo dell’asse usa labs(x = ...): il titolo non è un’etichetta della tacca. Sostituisci x con y per applicare le stesse regole all’asse verticale.

Gli esempi richiedono R e ggplot2. L’esempio continuo usa anche il pacchetto scales per la funzione di formattazione. Sono stati verificati con R 4.1.2, ggplot2 3.3.5 e scales 1.1.1. Gli argomenti impiegati sono presenti anche nell’API corrente di ggplot2, sebbene il tema possa apparire leggermente diverso tra versioni.

Operazione Controllo ggplot2
Cambiare il titolo dell’asse labs(x = "Title") o labs(y = "Title")
Rinominare le etichette associate a fattori o stringhe scale_x_discrete(labels = ...)
Impostare posizioni e testo numerici scale_x_continuous(breaks = ..., labels = ...)
Ruotare o formattare il testo mostrato theme(axis.text.x = element_text(...))
Formattare un asse Date scale_x_date(breaks = ..., labels = ...)

Creare un grafico ggplot2 di riferimento

Un solo piccolo data frame consente di distinguere l’effetto di ogni modifica. plan è un fattore, quindi usa una scala x discreta. orders è numerico e usa una scala y continua.

library(ggplot2)

plan_sales <- data.frame(
  plan = factor(
    c("starter", "standard", "premium", "enterprise"),
    levels = c("starter", "standard", "premium", "enterprise")
  ),
  orders = c(180, 250, 210, 140)
)

base_plot <- ggplot(plan_sales, aes(x = plan, y = orders)) +
  geom_col(fill = "#2c7fb8", width = 0.7) +
  labs(x = "Plan", y = "Orders") +
  theme_minimal(base_size = 16)

base_plot
ggsave(
  "ggplot-default-axis-tick-labels.png",
  plot = base_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)

Grafico ggplot2 predefinito con le etichette delle tacche degli assi x e y invariate.

Il grafico di riferimento mostra sull’asse x i quattro valori memorizzati del fattore e sull’asse y tacche numeriche scelte automaticamente. labs(x = "Plan") fornisce il titolo visibile “Plan”, ma non rinomina starter, standard, premium o enterprise.

Prima di scegliere la scala, controlla il tipo della variabile mappata. str(plan_sales$plan) segnala un fattore, mentre str(plan_sales$orders) segnala un vettore numerico. Un fattore contenente "1", "2" e "3" resta discreto. Al contrario, una colonna numerica rimane continua anche se contiene pochi valori distinti. Cambia il tipo solo quando la conversione rappresenta correttamente il significato dei dati.

Rinominare e ordinare etichette discrete

In una scala discreta, abbina breaks a labels. breaks identifica i valori dei dati per i quali mostrare una tacca, mentre labels fornisce il testo stampato. L’abbinamento esplicito impedisce che un’etichetta venga assegnata al valore sbagliato dopo una modifica dell’ordine.

L’esempio seguente riordina anche le categorie in modo sicuro. Modifica i livelli del fattore in una copia dei dati e passa la stessa sequenza a breaks. Il vettore con nomi rende leggibile la corrispondenza prima ancora di eseguire il grafico.

plan_order <- c("premium", "standard", "starter", "enterprise")
plan_names <- c(
  premium = "Premium",
  standard = "Standard",
  starter = "Starter",
  enterprise = "Enterprise"
)

ordered_sales <- plan_sales
ordered_sales$plan <- factor(ordered_sales$plan, levels = plan_order)

discrete_plot <- ggplot(ordered_sales, aes(x = plan, y = orders)) +
  geom_col(fill = "#2c7fb8", width = 0.7) +
  scale_x_discrete(
    breaks = plan_order,
    labels = plan_names[plan_order]
  ) +
  labs(x = "Plan", y = "Orders") +
  theme_minimal(base_size = 16)

discrete_plot
ggsave(
  "ggplot-discrete-axis-tick-labels.png",
  plot = discrete_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)

Grafico ggplot2 con le categorie discrete dell’asse x rinominate e riordinate.

La sequenza visibile è Premium, Standard, Starter, Enterprise. I valori memorizzati restano minuscoli; cambia solo la presentazione. labels può ricevere anche una funzione quando la stessa regola vale per tutte le tacche. Ad esempio, scale_x_discrete(labels = abbreviate) passa i valori alla funzione abbreviate() di R base. Una funzione personalizzata function(x) deve restituire un vettore di caratteri della stessa lunghezza.

Se servono soltanto nuovi nomi mantenendo l’ordine esistente, ometti breaks e passa un vettore con nomi che copra ogni valore mostrato, come c(starter = "Starter", standard = "Standard", premium = "Premium", enterprise = "Enterprise"). La forma abbinata precedente è preferibile quando sia l’insieme sia l’ordine sono requisiti. Dopo un filtro, leggi l’asse da sinistra a destra e confrontalo con la sequenza attesa indicata accanto all’immagine.

breaks e limits non sono equivalenti. Su una scala discreta, breaks seleziona le tacche visibili senza cambiare le categorie accettate. limits definisce invece i valori ammessi e il loro ordine. I valori esclusi diventano mancanti; uno strato come geom_col() può quindi rimuovere le relative righe con un avviso. Riordina il fattore quando l’ordine riguarda i dati e usa limits solo quando l’esclusione è intenzionale.

Impostare e formattare le tacche di un asse continuo

Un asse numerico richiede una scala continua. Specifica le posizioni esatte con breaks, quindi passa a labels un vettore di stringhe corrispondente oppure una funzione di formattazione. La funzione è più sicura se i valori possono cambiare, perché ggplot2 la chiama con le tacche definitive.

Questo grafico a dispersione colloca le tacche della potenza a 100, 200 e 300 e aggiunge l’unità tramite scales::label_number(). La chiamata diretta alla funzione verifica il testo prima del disegno.

hp_breaks <- c(100, 200, 300)
hp_formatter <- scales::label_number(suffix = " hp", accuracy = 1)
hp_formatter(hp_breaks)

continuous_plot <- ggplot(mtcars, aes(x = hp, y = mpg)) +
  geom_point(size = 3, color = "#d95f0e") +
  scale_x_continuous(
    breaks = hp_breaks,
    labels = hp_formatter
  ) +
  labs(x = "Engine power", y = "Fuel economy (mpg)") +
  theme_minimal(base_size = 16)

continuous_plot
ggsave(
  "ggplot-continuous-axis-tick-labels.png",
  plot = continuous_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)
[1] "100 hp" "200 hp" "300 hp"

Grafico ggplot2 con posizioni personalizzate ed etichette delle tacche formattate su un asse continuo.

L’asse x deve mostrare esattamente queste tre etichette. Per un asse y numerico usa la chiamata equivalente scale_y_continuous(). Altre funzioni di scales gestiscono separatori delle migliaia, percentuali, valute e formati simili. I dati restano numerici: cambia solo il testo visualizzato.

I breaks esatti sono adatti quando le posizioni hanno un significato. Se conta solo il formato, ometti breaks, lascia che ggplot2 scelga le posizioni dall’intervallo e passa a labels soltanto la funzione. Non convertire la colonna numerica in stringhe per aggiungere un suffisso: cambieresti il tipo di scala e potresti ottenere un ordine lessicografico anziché una spaziatura numerica.

Le date appartengono a un tipo di scala separato. Quando la colonna eredita da Date, usa scale_x_date() o l’equivalente per y invece di forzarla in una scala numerica o discreta. Il principio breaks-labels rimane valido, con intervalli e formattatori specifici per le date.

Ruotare le etichette sovrapposte

Cambiare il contenuto e cambiare lo stile risolvono problemi diversi. Se il testo è corretto ma si sovrappone, mantieni la scala e modifica axis.text.x nel tema. angle = 35 ruota ogni etichetta e hjust = 1 ne allinea il bordo destro alla tacca. Una dimensione base maggiore mantiene leggibile il risultato quando il grafico si restringe.

channel_sales <- data.frame(
  channel = c(
    "North America Online",
    "Europe Retail Stores",
    "Asia Pacific Partners",
    "Latin America Direct"
  ),
  orders = c(260, 220, 195, 150)
)

rotated_plot <- ggplot(channel_sales, aes(x = channel, y = orders)) +
  geom_col(fill = "#31a354", width = 0.65) +
  labs(x = "Sales channel", y = "Orders") +
  theme_minimal(base_size = 18) +
  theme(
    axis.text.x = element_text(angle = 35, hjust = 1, vjust = 1)
  )

rotated_plot
ggsave(
  "ggplot-rotated-axis-tick-labels.png",
  plot = rotated_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)

Etichette affollate dell’asse x in ggplot2, ruotate e allineate per evitare sovrapposizioni.

La rotazione conserva tutti e quattro i nomi. Se si sovrappongono ancora, abbreviare il testo o allargare il grafico comunica meglio di un angolo più ripido. Nell’ambiente verificato con ggplot2 3.3.5, scale_x_discrete(guide = guide_axis(n.dodge = 2)) distribuisce le etichette discrete su due righe; la funzione è presente anche nell’API corrente. Questa soluzione richiede più spazio verticale.

Nascondere etichette, tacche o posizioni in modo mirato

Scegli l’elemento da rimuovere invece di trattare questi controlli come sinonimi. I tre oggetti seguenti producono risultati differenti:

control_plot <- base_plot +
  theme_classic(base_size = 16)

labels_hidden <- control_plot +
  theme(axis.text.x = element_blank())

ticks_hidden <- control_plot +
  theme(axis.ticks.x = element_blank())

breaks_hidden <- control_plot +
  scale_x_discrete(breaks = NULL)

control_plot usa theme_classic(), che disegna tacche corte e fornisce quindi una base visibile. labels_hidden rimuove solo il testo stampato. ticks_hidden rimuove solo le tacche, lasciando i nomi delle categorie. breaks_hidden impedisce alla scala di produrre posizioni di tacca principali; scompaiono le etichette e le tacche associate. Nessuna espressione filtra righe da plan_sales.

L’opzione labels = NULL nasconde il testo a livello di scala mantenendo le posizioni. È adatta quando la scala non deve fornire etichette. Preferisci element_blank() quando la scala resta significativa ma un tema specifico non deve disegnare il testo. Se nascondi i nomi delle categorie, aggiungi annotazioni dirette o un’altra chiave per rendere ancora identificabili barre e punti.

Non vengono salvate immagini aggiuntive per queste varianti, perché il codice selezionabile e la descrizione permettono un confronto preciso. Stampa, ad esempio, ticks_hidden nella console R e confrontalo con control_plot. Le barre e le altezze devono rimanere identiche; cambiano soltanto le guide dell’asse. Se cambia la geometria o appare un avviso su righe rimosse, cerca una chiamata a limits altrove nel grafico.

Risolvere etichette errate o mancanti

Se ggplot2 segnala un valore continuo fornito a una scala discreta, o il contrario, controlla la colonna con str() prima di cambiare il grafico. Fattori e stringhe usano scale discrete, i numeri scale continue e gli oggetti Date o data-ora le rispettive scale. Converti i dati solo se il nuovo tipo ne rappresenta il significato reale.

Quando labels riceve un vettore di caratteri, abbinalo a breaks espliciti e mantieni la stessa lunghezza. Altrimenti le etichette possono spostarsi dopo filtri, riordinamenti o nuove categorie. Una mappatura con nomi come plan_names documenta la corrispondenza; una funzione evita il problema della lunghezza quando una trasformazione vale per ogni tacca.

Barre mancanti o avvisi su righe rimosse indicano spesso limits, non labels. Controlla che i limiti non omettano valori presenti nei dati. Usa breaks se vuoi solo ridurre il numero di etichette visibili. Per lo zoom o l’intervallo, consulta come impostare i limiti degli assi ggplot2 senza confonderli con le tacche.

Infine, verifica se il testo è davvero un’etichetta della tacca. labs(x = "Plan") e l’argomento name di una scala x impostano il titolo dell’asse. L’argomento labels controlla invece il testo delle tacche. Distinguere questi ruoli evita che il titolo cambi correttamente mentre categorie o numeri restano invariati.

Per la maggior parte dei grafici, scegli la scala dal tipo di dati, abbina breaks e labels quando il testo esatto è importante e riserva theme() all’aspetto. In questo modo le modifiche sono prevedibili e le osservazioni sottostanti restano intatte.