Barplot in R

Quando una variabile assume pochi valori, è comune riassumere le informazioni con una tabella di frequenza che può essere rappresentata con un barchart o barplot in R. In questo articolo spiegheremo le basi della creazione di grafici a barre in R.

La funzione R barplot

Per creare un grafico a barre in R puoi usare la funzione base R barplot. In questo esempio, creeremo un grafico a barre da un frame di dati. In particolare, il dataset di esempio è il ben noto mtcars. Per prima cosa, caricate i dati e create una tabella per la colonna cyl con la funzione table.

# Load datadata(mtcars)attach(mtcars)# Frequency tablemy_table <- table(cyl)my_table
cyl 4 6 811 7 14

Ricordo che per creare un grafico a barre in R potete usare la funzione barplot impostando come parametro la vostra tabella precedentemente creata per visualizzare la frequenza assoluta dei dati. Tuttavia, se preferite un grafico a barre con percentuali nell’asse verticale (la frequenza relativa), potete usare la funzione prop.table e moltiplicare il risultato per 100 come segue.

# One row, two columnspar(mfrow = c(1, 2))# Absolute frequency barplotbarplot(my_table, main = "Absolute frequency", col = rainbow(3))# Relative frequency barplotbarplot(prop.table(my_table) * 100, main = "Relative frequency (%)", col = rainbow(3))par(mfrow = c(1, 1))

Nota che puoi anche creare un grafico a barre con dati fattoriali con la funzione plot.

plot(factor(mtcars$cyl), col = rainbow(3))

Inoltre, potete mostrare dei numeri sulle barre con la funzione testo come segue:

barp <- barplot(my_table, col = rainbow(3), ylim = c(0, 15))text(barp, my_table + 0.5, labels = my_table)
Assegnando un grafico a barre all’interno di una variabile, memorizzerete i valori degli assi corrispondenti al centro di ogni barra.

Puoi anche aggiungere una griglia dietro le barre con la funzione grid.

barp <- barplot(my_table, col = rainbow(3), ylim = c(0, 15))grid(nx = NA, ny = NULL, lwd = 1, lty = 1, col = "gray")barplot(my_table, col = rainbow(3), ylim = c(0, 15), add = TRUE)

Parametri grafici del grafico a barre: titolo, etichette degli assi e colori

Come gli altri grafici, puoi specificare un’ampia varietà di parametri grafici, come etichette degli assi, un titolo o personalizzare gli assi. Nel blocco di codice precedente abbiamo personalizzato i colori del grafico a barre con il parametro col. Potete impostare i colori che preferite con un vettore o usare la funzione rainbow con il numero di barre come parametro come abbiamo fatto noi o usare altre funzioni di palette di colori. Potete anche cambiare il colore del bordo delle barre con l’argomento border.

barplot(my_table, # Data main = "Customized bar plot", # Title xlab = "Number of cylinders", # X-axis label ylab = "Frequency", # Y-axis label border = "black", # Bar border colors col = c("darkgrey", "darkblue", "red")) # Bar colors

Modificare le etichette dei gruppi

L’etichetta di ogni gruppo può essere modificata con l’argomento names.arg. Nel nostro esempio, i gruppi sono etichettati con numeri, ma possiamo cambiarli digitando qualcosa come:

barplot(my_table, names.arg = c("four", "six", "eight")) 

Larghezza e spazio delle barre

Puoi anche modificare lo spazio tra le barre o la larghezza delle barre con gli argomenti width e space. Per lo spazio tra i gruppi, consultate la sezione corrispondente di questo tutorial.

par(mfrow = c(1, 2))# Bar width (by default: width = 1)barplot(my_table, main = "Change bar width", col = rainbow(3), width = c(0.4, 0.2, 1))# Bar spacebarplot(my_table, main = "Change space between bars", col = rainbow(3), space = c(1, 1.1, 0.1))par(mfrow = c(1, 1))
Il vettore space rappresenta lo spazio della barra rispetto alla precedente, quindi il primo elemento non sarà preso in considerazione.

Barplot da dataframe o lista

Inoltre, è possibile creare un barplot direttamente con le variabili di un dataframe o anche una matrice, ma si noti che la variabile deve essere il conteggio di qualche evento o caratteristica. Nell’esempio seguente contiamo il numero di veicoli per colore e li tracciamo con un grafico a barre. Useremo ogni colore di auto per colorare le barre corrispondenti.

df <- data.frame(carColor = c("red", "green", "white", "blue"), count = c(3, 5, 9, 1))# df <- as.list(df) # Equivalentbarplot(height = df$count, names = df$carColor, col = c("red", "green", "white", "blue"))

Barplot per variabile continua

Nel caso stiate lavorando con una variabile continua dovrete usare la funzione cut per categorizzare i dati. Altrimenti, in caso di assenza di legami, avrete tante barre quante sono le lunghezze del vostro vettore e le altezze delle barre saranno uguali a 1. Nell’esempio seguente divideremo i nostri dati da 0 a 45 per passi di 5 con l’argomento breaks.

x <- c(2.1, 8.6, 3.9, 4.4, 4.0, 3.7, 7.6, 3.1, 5.0, 5.5, 20.2, 1.7, 5.2, 33.7, 9.1, 1.6, 3.1, 5.6, 16.5, 15.8, 5.8, 6.8, 3.3, 40.6)barplot(table(cut(x, breaks = seq(0, 45, by = 5))))

Barplot orizzontale

Per default, i barplot in R sono tracciati verticalmente. Tuttavia, è comune rappresentare grafici a barre orizzontali. Puoi ruotare di 90º il grafico e creare un grafico a barre orizzontale impostando l’argomento horiz a TRUE.

barplot(my_table, main = "Barchart", ylab = "Number of cylinders", xlab = "Frequency", horiz = TRUE) # Horizontal barplot

R barplot legend

Una leggenda può essere aggiunta a un barplot in R con l’argomento legend.text, dove puoi specificare i nomi che vuoi aggiungere alla leggenda. Si noti che in RStudio il plot risultante può essere leggermente diverso, poiché lo sfondo della legenda sarà bianco invece che trasparente.

barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table)) # Legend
Si noti che, utilizzando l’argomento legend.text, la legenda può sovrapporsi al barplot.

Il metodo più semplice per risolvere questo problema in questo esempio è spostare la legenda. Questo può essere ottenuto con l’argomento args.legend, dove puoi impostare i parametri grafici all’interno di una lista. Potete impostare la posizione su top, bottom, topleft, topright, bottomleft e bottomright.

barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table), args.legend = list(x = "top"))

Equivalentemente, potete ottenere la trama precedente con la leggenda con la funzione legend come segue con gli argomenti legend e fill.

barplot(my_table, xlab = "Number of cylinders", col = rainbow(3))legend("top", legend = rownames(my_table), fill = rainbow(3))

Tuttavia, questo approccio funziona bene solo se la leggenda non si sovrappone alle barre in quelle posizioni. Un approccio migliore è quello di spostare la leggenda a destra, fuori dal grafico a barre. Potete farlo impostando l’argomento inset passato come elemento di una lista all’interno dell’argomento args.legend come segue.

par(mar = c(5, 5, 4, 10))barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table), # Legend values args.legend = list(x = "topright", inset = c(-0.20, 0))) # Legend arguments

Potreste anche cambiare i limiti degli assi con gli argomenti xlim o ylim per i grafici a barre verticali e orizzontali, rispettivamente, ma notate che in questo caso il valore da specificare dipende dal numero e dalla larghezza delle barre. Ricordate che se assegnate un grafico a barre a una variabile potete memorizzare i punti dell’asse che corrispondono al centro di ogni barra.

barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table), xlim = c(0, 4.25))

Un’altra alternativa per spostare la legenda è spostarla sotto il grafico a barre con le funzioni layout, par e plot.new. Questo approccio è più avanzato degli altri e potrebbe essere necessario cancellare i parametri grafici prima dell’esecuzione del codice per ottenere la trama corretta, poiché i parametri grafici saranno modificati.

# dev.off()# opar <- par(no.readonly = TRUE)plot.new()layout(rbind(1, 2), heights = c(10, 3))barplot(my_table, xlab = "Number of cylinders", col = rainbow(3))par(mar = c(0, 0, 0, 0))plot.new()legend("top", rownames(my_table), lty = 1, col = c("red", "green", "blue"), lwd = c(1, 2))# dev.off()# on.exit(par(opar))

Grouped barplot in R

Un grouped barplot, conosciuto anche come side by side bar plot o clustered bar chart è un barplot in R con due o più variabili. Il grafico mostrerà le barre per ciascuna delle variabili multiple.

# Variable am to factoram <- factor(am)# Change factor levelslevels(am) <- c("Automatic", "Manual")# Table cylinder - transmission typeother_table <- table(cyl, am)# other_table <- xtabs(~cyl + am , data = mtcars) # Equivalentbarplot(other_table, main = "Grouped barchart", xlab = "Transmission type", ylab = "Frequency", col = c("darkgrey", "darkblue", "red"), legend.text = rownames(other_table), beside = TRUE) # Grouped bars

Nota che se avessimo specificato table(am, cyl) invece di table(cyl, am) l’asse X rappresenterebbe il numero di cilindri invece del tipo di trasmissione.

Spazio tra gruppi

Come abbiamo visto prima, puoi cambiare lo spazio tra le barre. Nel caso di più gruppi potete impostare un vettore a due elementi dove il primo elemento è lo spazio tra le barre di ogni gruppo (0,4) e il secondo lo spazio tra i gruppi (2,5).

barplot(other_table, main = "Grouped barchart space", xlab = "Transmission type", ylab = "Frequency", col = c("darkgrey", "darkblue", "red"), legend.text = rownames(other_table), beside = TRUE, space = c(0.4, 2.5)) # Space 

Valori numerici nei gruppi

I diagrammi a barre possono anche essere usati per riassumere una variabile in gruppi dati da uno o più fattori. Considerate, per esempio, che volete visualizzare il numero di cilindri e il tipo di trasmissione in base alla media della potenza in cavalli delle auto. Potreste usare la funzione tapply per creare la tabella corrispondente:

summary_data <- tapply(mtcars$hp, list(cylinders = mtcars$cyl, transmission = mtcars$am), FUN = mean, na.rm = TRUE)summary_data
 transmissioncylinders Automatic Manual 4 84.66667 81.8750 6 115.25000 131.6667 8 194.16667 299.5000

Ora, potete creare il corrispondente diagramma a barre in R:

par(mar = c(5, 5, 4, 10))barplot(summary_data, xlab = "Transmission type", main = "Horsepower mean", col = rainbow(3), beside = TRUE, legend.text = rownames(summary_data), args.legend = list(title = "Cylinders", x = "topright", inset = c(-0.20, 0)))

Trama con barre di errore in R

Per default, non potete creare un diagramma a barre con barre di errore. Tuttavia, la seguente funzione vi permetterà di creare un grafico a barre completamente personalizzabile con barre di errore standard.

# Arguments:# x: an unique factor object# y: a numeric vector object# ...: additional arguments to be passed to barplot functionbarplot.error <- function(x, y, ...){ mod <- lm(y ~ x) reps <- sqrt(length(y)/length(levels(x))) sem <- sigma(mod)/reps means <- tapply(y, x, mean) upper <- max(means) + sem lev <- levels(x) barpl <- barplot(means, ...) invisible(sapply(1:length(barpl), function(i) arrows(barpl, means + sem, barpl, means - sem, angle = 90, code = 3, length = 0.08)))}# Calling the functionbarplot.error(factor(mtcars$cyl), mtcars$hp, col = rainbow(3), ylim = c(0, 250))

Anche se potete aggiungere barre di errore a un grafico a barre, si dovrebbe notare che un boxplot per gruppo potrebbe essere un approccio migliore per riassumere i dati in questo scenario.

Stacked barplot in R

Un grafico a barre impilate è come un grafico a barre raggruppato, ma la frequenza delle variabili è impilata. Questo tipo di grafico a barre viene creato di default quando si passa come argomento una tabella con due o più variabili, dato che l’argomento beside è di default FALSE.

barplot(other_table, main = "Stacked barchart", xlab = "Transmission type", ylab = "Frequency", col = c("darkgrey", "darkblue", "red"), legend.text = rownames(other_table), beside = FALSE) # Stacked bars (default)

Relativamente ai grafici a barre impilati, esistono implementazioni simili, come lo spine plot e il mosaic plot. Questo tipo di grafici può essere creato con le funzioni spineplot e mosaicplot del pacchetto graphics.

Il mosaic plot permette di visualizzare i dati di due o più variabili quantitative, dove l’area di ogni rettangolo rappresenta la proporzione di quella variabile su ogni gruppo.

# install.packages("graphics")library(graphics)mosaicplot(other_table, main = "Mosaic plot")

Lo spineplot è un caso speciale di mosaic plot, ed è una generalizzazione dello stacked barplot. In questo caso, a differenza degli stacked barplot, ogni barra si somma ad una sola.

spineplot(other_table)

Nota che, per default, gli assi sono scambiati rispetto allo stacked bar plot creato nella sezione precedente. Puoi creare il grafico equivalente trasponendo la tabella delle frequenze con la funzione t.

spineplot(t(other_table))

Barplot in R: ggplot2

La libreria ggplot2 è una nota libreria grafica in R. Puoi creare un barplot con questa libreria convertendo i dati in data frame e con le funzioni ggplot e geom_bar. Nell’argomento aes dovete passare i nomi delle variabili del vostro dataframe. In x la variabile categorica e in y la numerica.

# install.packages("ggplot2")library(ggplot2)df <- as.data.frame(my_table)ggplot(data = df, aes(x = cyl, y = Freq)) + geom_bar(stat = "identity")

Horizontal barplot ggplot2

Se vuoi ruotare il precedente barplot usa la funzione coord_flip come segue.

ggplot(data = df, aes(x = cyl, y = Freq)) + geom_bar(stat = "identity") + coord_flip() # Horizontal bar plot

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.