boxplot() in R: come realizzare BoxGrafici in RStudio
⚡ Riepilogo intelligente
BoxIn R, la funzione `plot` riassume una distribuzione numerica attraverso la mediana, i quartili, i baffi e i valori anomali, utilizzando la funzione `geom_boxplot()` di ggplot2. Questa guida illustra come creare un box plot sul dataset relativo alla qualità dell'aria, sovrapponendo colori, punti, jitter, tacche e confronti tra gruppi.

boxplot() in R
boxplot() in R aiuta a visualizzare la distribuzione dei dati per quartile e a rilevare la presenza di valori anomali. Puoi usare l'oggetto geometrico geom_boxplot() dalla libreria ggplot2 per disegnare un boxplot() in R.
Utilizzeremo il dataset sulla qualità dell'aria per introdurre la funzione boxplot() in R con ggplot. Il dataset registra le misurazioni giornaliere della qualità dell'aria a New York da maggio a settembre 1973 e contiene 153 osservazioni. Utilizzeremo le seguenti variabili:
- Ozono: variabile numerica
- Vento: variabile numerica
- Mese: da maggio a settembre. Variabile numerica
Prima di disegnarne uno, è utile sapere esattamente cosa rappresenta ogni parte del riquadro.
Come leggere a Box Grafico: Quartili, IQR e valori anomali
Ogni elemento di un diagramma a scatola codifica un numero tratto dal riepilogo a cinque numeri. Sapere a quale numero corrisponde ciascun elemento trasforma il grafico da semplice elemento decorativo a strumento di analisi.
- Cerniera inferiore: il primo quartile, Q1. Il venticinque percento delle osservazioni si trova al di sotto di esso.
- Linea mediana: il secondo quartile. La sua posizione all'interno del riquadro rivela l'asimmetria: una linea spinta verso il basso significa che i dati sono asimmetrici a destra.
- Cerniera superiore: il terzo quartile, Q3. Il settantacinque percento delle osservazioni si trova al di sotto di esso.
- Box Altezza: l'intervallo interquartile, IQR = Q3 – Q1, che contiene la metà centrale dei dati ed è la misura standard robusta della dispersione.
- Basettoni: Si estendono fino all'osservazione più estrema, rimanendo comunque entro 1.5 volte l'IQR della cerniera più vicina. Non rappresentano il minimo e il massimo.
- Punti che vanno oltre i baffi: osservazioni segnalate come valori anomali da quella regola dell'IQR di 1.5.
Due avvertenze. In primo luogo, un "valore anomalo" in questo caso è un segnale statistico, non un errore: in una distribuzione asimmetrica come quella della concentrazione di ozono, i valori elevati sono prevedibili e non dovrebbero essere eliminati. In secondo luogo, un box plot nasconde la forma della distribuzione, quindi due gruppi con box identici possono avere dati sottostanti molto diversi. L'aggiunta di punti con dispersione, come mostrato di seguito, previene questo problema.
Box Grafico vs Istogramma vs Grafico a violino in R
Tutti e tre i grafici descrivono una distribuzione numerica, ma ognuno rivela qualcosa che gli altri nascondono.
| Criteri | Box Terreno | Istogramma | Trama del violino |
|---|---|---|---|
| Spettacoli | Mediana, quartili, valori anomali | Frequenza in ciascun intervallo | Curva di densità completa |
| Revpicchi multipli | Non | Si | Si |
| Segnala i valori anomali | Sì, esplicitamente | Solo visivamente | Non direttamente |
| Confronto di molti gruppi | Ottimo | Scomodo | Buone |
| Richiede una scelta di accordatura | Non | Sì, conteggio dei bidoni | Sì, larghezza di banda |
| oggetto ggplot2 | geom_boxplot() | geom_histogram() | geom_violin() |
Un compromesso comune è quello di disegnare un grafico a violino con un box plot stretto al suo interno, che mantiene la forma della densità e il riepilogo dei quartili in un unico grafico. Vedi il tutorial sull'istogramma per quanto riguarda il lato del confronto relativo alla suddivisione in contenitori.
Crea Box Terreno
Prima di iniziare a creare il tuo primo boxplot() in R, devi manipolare i dati come segue:
- Passaggio 1: importa i dati
- Passaggio 2: eliminare le variabili non necessarie
- Passaggio 3: Convertire il mese in un fattore ordinato
- Passaggio 4: Crea una nuova variabile categoriale che suddivida ogni mese in tre parti: Inizio, Metà e Fine
- Passaggio 5: rimuovere le osservazioni mancanti
Tutti questi passaggi vengono eseguiti con dplyr e l'operatore pipeline %>%.
library(dplyr) library(ggplot2) # Step 1 data_air <- airquality %>% #Step 2 select(-c(Solar.R, Temp)) %>% #Step 3 mutate(Month = factor(Month, order = TRUE, labels = c("May", "June", "July", "August", "September")), #Step 4 day_cat = factor(ifelse(Day < 10, "Begin", ifelse(Day < 20, "Middle", "End"))))
Una buona pratica è verificare la struttura dei dati con la funzione scorce().
glimpse(data_air)
Produzione:
## Observations: 153 ## Variables: 5 ## $ Ozone <int> 41, 36, 12, 18, NA, 28, 23, 19, 8, NA, 7, 16, 11, 14, ... ## $ Wind <dbl> 7.4, 8.0, 12.6, 11.5, 14.3, 14.9, 8.6, 13.8, 20.1, 8.6... ## $ Month <ord> May, May, May, May, May, May, May, May, May, May, May,... ## $ Day <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,... ## $ day_cat <fctr> Begin, Begin, Begin, Begin, Begin, Begin, Begin, Begi...
Sia Ozone che Solar.R contengono valori NA. Poiché geom_boxplot() li ignorerebbe silenziosamente e visualizzerebbe un avviso, è più pulito rimuoverli esplicitamente.
# Step 5
data_air_nona <-data_air %>% na.omit()
Box plot di base
Ora tracciamo la distribuzione dell'ozono per mese.
# Store the graph box_plot <- ggplot(data_air_nona, aes(x = Month, y = Ozone)) # Add the geometric object box plot box_plot + geom_boxplot()
Code Spiegazione
- Memorizzare il grafico per un ulteriore utilizzo
- box_plot: il grafico di base è memorizzato nell'oggetto box_plot, che consente di aggiungere livelli in seguito senza ripetere l'intera chiamata
- Aggiungi l'oggetto geometrico
- Si passa il set di dati data_air_nona a ggplot boxplot.
- All'interno dell'argomento aes() aggiungi l'asse x e l'asse y.
- Il segno + significa che vuoi che R continui a leggere il codice. Rende il codice più leggibile rompendolo.
- Utilizzare geom_boxplot() per creare un box plot
Produzione:
Cambia lato del grafico
Puoi capovolgere il lato del grafico.
box_plot +
geom_boxplot()+
coord_flip()
Code Spiegazione
- box_plot: Utilizzi il grafico che hai memorizzato. Evita di riscrivere tutti i codici ogni volta che aggiungi nuove informazioni al grafico.
- geom_boxplot(): disegna le scatole e i baffi
- coord_flip(): capovolge il lato del grafico
Produzione:
Cambia il colore del valore anomalo
È possibile modificare il colore, la forma e la dimensione dei valori anomali.
box_plot +
geom_boxplot(outlier.colour = "red",
outlier.shape = 2,
outlier.size = 3) +
theme_classic()
Code Spiegazione
- outlier.color="red": controlla il colore dei valori anomali
- outlier.shape=2: modifica la forma dell'outlier. 2 si riferisce al triangolo
- outlier.size=3: Modifica la dimensione del triangolo. Numeri più grandi disegnano marcatori più grandi.
Produzione:
Aggiungi una statistica riassuntiva
È possibile sovrapporre una statistica riassuntiva, come la media del gruppo, che il diagramma a scatola non mostra.
box_plot +
geom_boxplot() +
stat_summary(fun.y = mean,
geom = "point",
size = 3,
color = "steelblue") +
theme_classic()
Code Spiegazione
- La funzione stat_summary() aggiunge una statistica calcolata sopra il diagramma a scatola.
- L'argomento `fun` controlla quale statistica viene restituita. In questo caso, si tratta della media. Si noti che il codice precedente utilizzava `fun.y`, che ggplot2 ha deprecato nella versione 3.3.0.
- Nota: sono disponibili altre statistiche, ad esempio min e max. È possibile visualizzare più statistiche nello stesso grafico
- geom = “punto”: traccia la media con un punto
- size=3: dimensione del punto
- color =”steelblue”: Colore dei punti
Produzione:
Box Traccia con punti
Successivamente, aggiungi un livello di grafico a punti sopra i riquadri. Ogni punto rappresenta una singola osservazione, rendendo visibile la dimensione del campione dietro ogni riquadro.
box_plot +
geom_boxplot() +
geom_dotplot(binaxis = 'y',
dotsize = 1,
stackdir = 'center') +
theme_classic()
Code Spiegazione
- geom_dotplot() disegna un punto per ogni osservazione, impilato all'interno di ogni bin
- binaxis='y': cambia la posizione dei punti lungo l'asse y. Per impostazione predefinita, asse x
- dotsize=1: dimensione dei punti
- stackdir='center': modo di impilare i punti: quattro valori:
- “su” (predefinito),
- "giù"
- "centro"
- “centrointero”
Produzione:
Controllo Estetico del Box Terreno
Cambia il colore della scatola
Puoi cambiare i colori del gruppo.
ggplot(data_air_nona, aes(x = Month, y = Ozone, color = Month)) + geom_boxplot() + theme_classic()
Code Spiegazione
- I colori dei gruppi sono controllati nella mappa aes()pingÈ possibile utilizzare color=Month per cambiare il colore del box plot e del diagramma a baffi in base ai mesi
Produzione:
Box trama con più gruppi
È anche possibile aggiungere più gruppi. È possibile visualizzare la differenza della qualità dell'aria in base al giorno della misurazione.
ggplot(data_air_nona, aes(Month, Ozone)) + geom_boxplot(aes(fill = day_cat)) + theme_classic()
Code Spiegazione
- La mappa aes()ping l'oggetto geometrico controlla i gruppi da visualizzare (questa variabile deve essere un fattore)
- aes(fill= day_cat) consente di creare tre caselle per ogni mese sull'asse x
Produzione:
Box Tracciare con punti tremolanti
Un altro modo per mostrare le singole osservazioni è tramite punti con jittering. Il jittering è la scelta usuale quando un asse x categorico fa sì che molti punti si trovino nella stessa posizione.
Questo metodo evita la sovrapposizioneping dei dati discreti.
box_plot +
geom_boxplot() +
geom_jitter(shape = 15,
color = "steelblue",
position = position_jitter(width = 0.21)) +
theme_classic()
Code Spiegazione
- geom_jitter() aggiunge un piccolo spostamento casuale a ciascun punto in modo che si sovrappongaping I valori diventano visibili.
- shape=15 cambia la forma dei punti. 15 rappresenta i quadrati
- color = “steelblue”: cambia il colore del punto
- position = position_jitter(width = 0.21): controlla di quanto vengono spostati lateralmente i punti, misurato in unità dell'asse x. Il valore predefinito è il 40% della spaziatura tra le categorie.
Produzione:
Puoi vedere la differenza tra il primo grafico con il metodo jitter e il secondo con il metodo point.
box_plot +
geom_boxplot() +
geom_point(shape = 5,
color = "steelblue") +
theme_classic()
dentellato Box Terreno
Una caratteristica interessante di geom_boxplot() è una funzione boxplot a tacche in R. Il grafico a tacche restringe la scatola attorno alla mediana. Lo scopo principale di un grafico a tacche è confrontare la significatività della mediana tra i gruppi. Ci sono forti prove che due gruppi hanno mediane diverse quando le tacche non si sovrappongono. Una tacca viene calcolata come segue:
Qui IQR rappresenta l'intervallo interquartile e n è il numero di osservazioni nel gruppo. L'incavo copre approssimativamente l'intervallo di confidenza del 95% della mediana.
box_plot +
geom_boxplot(notch = TRUE) +
theme_classic()
Code Spiegazione
- geom_boxplot(notch = TRUE): disegna il box plot con le tacche attorno alla mediana
Produzione:
Come aggiungere titoli, etichette e colori personalizzati a un Box Tracciare in R
I grafici sopra riportati utilizzano le impostazioni predefinite di ggplot2, che prendono i nomi delle variabili direttamente dal dataframe. Un grafico pubblicabile necessita di etichette leggibili e di una palette di colori ben definita.
Titoli ed etichette degli assi. Una chiamata a labs() imposta ogni elemento di testo:
box_plot +
geom_boxplot(fill = "coral", alpha = 0.7) +
labs(title = "Ozone concentration by month",
subtitle = "New York, May to September 1973",
x = "Month",
y = "Ozone (parts per billion)",
caption = "Source: airquality dataset") +
theme_classic()
Scegliere i propri colori. Utilizzare scale_fill_manual() quando il riempimento è mappato all'interno di aes() e scale_colour_manual() quando il colore è:
ggplot(data_air_nona, aes(x = Month, y = Ozone, fill = Month)) + geom_boxplot() + scale_fill_manual(values = c("#0e9cd1", "coral", "#7dc27d", "#c9a227", "grey60")) + theme_classic() + theme(legend.position = "none")
La legenda è disattivata in questo caso perché l'asse x riporta già i nomi di ciascun mese, quindi ripeterli comporterebbe uno spreco di spazio.
Riordino le scatole. I livelli del fattore determinano l'ordine sull'asse. Poiché il mese è stato creato come fattore ordinato, la visualizzazione è già cronologica. Per un fattore non ordinato, si procede invece all'ordinamento in base alla mediana:
ggplot(data_air_nona, aes(x = reorder(Month, Ozone, FUN = median), y = Ozone)) + geom_boxplot() + theme_classic()
Salvataggio del grafico. La funzione ggsave() salva l'ultimo grafico su disco a una risoluzione da te controllata:
ggsave("ozone_boxplot.png", width = 8, height = 5, dpi = 300)
Box Traccia in R: Code Referenze
La tabella seguente elenca la chiamata a ggplot2 per ciascuna variante di box plot descritta in precedenza:
| Obiettivo | Code |
|---|---|
| Box plot di base |
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() |
| Inverti l'orientamento |
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + coord_flip() |
| Box plot con tacche |
ggplot(df, aes(x = x1, y = y)) + geom_boxplot(notch = TRUE) |
| Box trama con punti tremolanti |
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + geom_jitter(position = position_jitter(0.21)) |
| Colorare per gruppo |
ggplot(df, aes(x = x1, y = y, color = x1)) + geom_boxplot() |
| Gruppi multipli per categoria |
ggplot(df, aes(x = x1, y = y)) + geom_boxplot(aes(fill = x2)) |
| Aggiungere la media del gruppo |
ggplot(df, aes(x = x1, y = y)) + geom_boxplot() + stat_summary(fun = mean, geom = "point") |
Controlla anche: - Tutorial R per principianti: impara il linguaggio di programmazione R











