Lorsqu’une variable prend quelques valeurs, il est courant de résumer l’information avec un tableau de fréquence qui peut être représenté avec un diagramme à barres ou un diagramme à barres en R. Dans cet article, nous allons expliquer les bases de la création de diagrammes à barres en R.
- La fonction R barplot
- Paramètres graphiques du graphique à barres : titre, étiquettes d’axes et couleurs
- Changer les étiquettes des groupes
- Largeur du graphique à barres et espace des barres
- Tableau de barres à partir d’un cadre de données ou d’une liste
- Tableau à barres pour une variable continue
- Tableau de bord horizontal
- Légende de barplot R
- Grouped barplot in R
- Espace entre les groupes
- Valeurs numériques dans les groupes
- Tableau à barres avec barres d’erreur dans R
- Tableau à barres empilées dans R
- Tableau à barres en R : ggplot2
- Traceau à barres horizontal ggplot2
La fonction R barplot
Pour créer un diagramme à barres en R, vous pouvez utiliser la fonction de base R barplot
. Dans cet exemple, nous allons créer un barplot à partir d’un cadre de données. Plus précisément, le jeu de données de l’exemple est le bien connu mtcars
. Tout d’abord, chargez les données et créez un tableau pour la colonne cyl
avec la fonction table
.
# Load datadata(mtcars)attach(mtcars)# Frequency tablemy_table <- table(cyl)my_table
cyl 4 6 811 7 14
Rappellez que pour créer un diagramme en bâtons dans R, vous pouvez utiliser la fonction barplot
paramétrant votre tableau précédemment créé pour afficher la fréquence absolue des données. Cependant, si vous préférez un diagramme à barres avec des pourcentages sur l’axe vertical (la fréquence relative), vous pouvez utiliser la fonction prop.table
et multiplier le résultat par 100 comme suit.
# 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))
Notez que vous pouvez également créer un diagramme à barres avec des données factorielles avec la fonction plot
.
plot(factor(mtcars$cyl), col = rainbow(3))
En outre, vous pouvez afficher des chiffres sur les barres avec la fonction texte comme suit :
barp <- barplot(my_table, col = rainbow(3), ylim = c(0, 15))text(barp, my_table + 0.5, labels = my_table)
Vous pouvez également ajouter une grille derrière les barres avec la fonction 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)
Paramètres graphiques du graphique à barres : titre, étiquettes d’axes et couleurs
Comme pour les autres graphiques, vous pouvez spécifier une grande variété de paramètres graphiques, comme les étiquettes d’axes, un titre ou personnaliser les axes. Dans le bloc de code précédent, nous avons personnalisé les couleurs du graphique à barres avec le paramètre col
. Vous pouvez définir les couleurs que vous préférez avec un vecteur ou utiliser la fonction rainbow
avec le nombre de barres comme paramètre comme nous l’avons fait ou utiliser d’autres fonctions de palette de couleurs. Vous pouvez également modifier la couleur de la bordure des barres avec l’argument 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
Changer les étiquettes des groupes
L’étiquette de chaque groupe peut être modifiée avec l’argument names.arg
. Dans notre exemple, les groupes sont étiquetés avec des numéros, mais nous pouvons les changer en tapant quelque chose comme:
barplot(my_table, names.arg = c("four", "six", "eight"))
Largeur du graphique à barres et espace des barres
Vous pouvez également modifier l’espace entre les barres ou la largeur des barres avec les arguments width
et space
. Pour l’espace entre les groupes, consultez la section correspondante de ce tutoriel.
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))
space
représente l’espace de la barre par rapport à la précédente, donc le premier élément ne sera pas pris en compte.Tableau de barres à partir d’un cadre de données ou d’une liste
En outre, vous pouvez créer un tableau de barres directement avec les variables d’un cadre de données ou même d’une matrice, mais notez que la variable doit être le compte d’un certain événement ou d’une caractéristique. Dans l’exemple suivant, nous comptons le nombre de véhicules par couleur et nous les représentons à l’aide d’un diagramme à barres. Nous utiliserons chaque couleur de voiture pour colorer les barres correspondantes.
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"))
Tableau à barres pour une variable continue
Dans le cas où vous travaillez avec une variable continue, vous devrez utiliser la fonction cut
pour catégoriser les données. Sinon, en cas d’absence d’égalité, vous aurez autant de barres que la longueur de votre vecteur et la hauteur des barres sera égale à 1. Dans l’exemple suivant, nous allons diviser nos données de 0 à 45 par pas de 5 avec l’argument 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))))
Tableau de bord horizontal
Par défaut, les tableaux de bord dans R sont tracés verticalement. Cependant, il est courant de représenter des barplots horizontaux. Vous pouvez faire pivoter de 90º le tracé et créer un diagramme à barres horizontal en définissant l’argument horiz
à TRUE
.
barplot(my_table, main = "Barchart", ylab = "Number of cylinders", xlab = "Frequency", horiz = TRUE) # Horizontal barplot
Légende de barplot R
Une légende peut être ajoutée à un barplot dans R avec l’argument legend.text
, où vous pouvez spécifier les noms que vous voulez ajouter à la légende. Notez que dans RStudio, le tracé résultant peut être légèrement différent, car le fond de la légende sera blanc au lieu d’être transparent.
barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table)) # Legend
legend.text
, la légende peut chevaucher le graphe à barres.La méthode la plus simple pour résoudre ce problème dans cet exemple est de déplacer la légende. Ceci peut être réalisé avec l’argument args.legend
, où vous pouvez définir des paramètres graphiques dans une liste. Vous pouvez définir la position à top
, bottom
, topleft
, topright
, bottomleft
et bottomright
.
barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table), args.legend = list(x = "top"))
Equivalemment, vous pouvez réaliser le tracé précédent avec la légende avec la fonction legend
comme suit avec les arguments legend
et fill
.
barplot(my_table, xlab = "Number of cylinders", col = rainbow(3))legend("top", legend = rownames(my_table), fill = rainbow(3))
Néanmoins, cette approche ne fonctionne bien que si la légende ne chevauche pas les barres dans ces positions. Une meilleure approche consiste à déplacer la légende vers la droite, hors du graphe à barres. Vous pouvez le faire en définissant l’argument inset
passé comme élément d’une liste dans l’argument args.legend
comme suit.
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
Vous pouvez également modifier les limites des axes avec les arguments xlim
ou ylim
pour les diagrammes à barres verticaux et horizontaux, respectivement, mais notez que dans ce cas, la valeur à spécifier dépendra du nombre et de la largeur des barres. Rappelez-vous que si vous affectez un diagramme à barres à une variable, vous pouvez stocker les points d’axe qui correspondent au centre de chaque barre.
barplot(my_table, xlab = "Number of cylinders", col = rainbow(3), legend.text = rownames(my_table), xlim = c(0, 4.25))
Une autre alternative pour déplacer la légende est de la déplacer sous le diagramme à barres avec les fonctions layout
, par
et plot.new
. Cette approche est plus avancée que les autres et vous devrez peut-être effacer les paramètres graphiques avant l’exécution du code pour obtenir le tracé correct, car les paramètres graphiques seront modifiés.
# 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, également connu sous le nom de side by side bar plot ou clustered bar chart est un diagramme à barres dans R avec deux variables ou plus. Le graphique affiche les barres pour chacune des multiples variables.
# 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
Notez que si nous avions spécifié table(am, cyl)
au lieu de table(cyl, am)
, l’axe des X représenterait le nombre de cylindres au lieu du type de transmission.
Espace entre les groupes
Comme nous l’avons revu précédemment, vous pouvez modifier l’espace entre les barres. Dans le cas de plusieurs groupes, vous pouvez définir un vecteur à deux éléments où le premier élément est l’espace entre les barres de chaque groupe (0,4) et le second l’espace entre les groupes (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
Valeurs numériques dans les groupes
Les diagrammes à barres peuvent également être utilisés pour résumer une variable dans des groupes donnés par un ou plusieurs facteurs. Considérons, par exemple, que vous voulez afficher le nombre de cylindres et le type de transmission en fonction de la moyenne de la puissance en chevaux des voitures. Vous pourriez utiliser la fonction tapply
pour créer le tableau correspondant:
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
Maintenant, vous pouvez créer le diagramme à barres correspondant dans 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)))
Tableau à barres avec barres d’erreur dans R
Par défaut, vous ne pouvez pas créer un diagramme à barres avec des barres d’erreur. Cependant, la fonction suivante vous permettra de créer un diagramme à barres entièrement personnalisable avec des barres d’erreur 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))
Même si vous pouvez ajouter des barres d’erreur à un diagramme à barres, il faut remarquer qu’un boxplot par groupe pourrait être une meilleure approche pour résumer les données dans ce scénario.
Tableau à barres empilées dans R
Un diagramme à barres empilées est comme un graphique à barres groupées, mais la fréquence des variables est empilée. Ce type de diagramme à barres sera créé par défaut lorsqu’on passe comme argument un tableau avec deux variables ou plus, car l’argument beside
est par défaut 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)
Relativement aux diagrammes à barres empilées, il existe des implémentations similaires, comme le spine plot et le mosaic plot. Ce type de tracés peut être créé avec les fonctions spineplot
et mosaicplot
du paquet graphics
.
Le tracé en mosaïque vous permet de visualiser les données de deux variables quantitatives ou plus, où la surface de chaque rectangle représente la proportion de cette variable sur chaque groupe.
# install.packages("graphics")library(graphics)mosaicplot(other_table, main = "Mosaic plot")
Le spineplot est un cas particulier de tracé en mosaïque, et sa une généralisation du barplot empilé. Dans ce cas, contrairement aux diagrammes à barres empilées, la somme de chaque barre est égale à un.
spineplot(other_table)
Notez que, par défaut, les axes sont intervertis par rapport au diagramme à barres empilées que vous avez créé dans la section précédente. Vous pouvez créer le tracé équivalent en transposant le tableau de fréquence avec la fonction t
.
spineplot(t(other_table))
Tableau à barres en R : ggplot2
La bibliothèque ggplot2
est une bibliothèque graphique bien connue en R. Vous pouvez créer un tableau à barres avec cette bibliothèque en convertissant les données en cadre de données et avec les fonctions ggplot
et geom_bar
. Dans l’argument aes
, vous devez passer les noms des variables de votre dataframe. Dans x
la variable catégorielle et dans y
la numérique.
# install.packages("ggplot2")library(ggplot2)df <- as.data.frame(my_table)ggplot(data = df, aes(x = cyl, y = Freq)) + geom_bar(stat = "identity")
Traceau à barres horizontal ggplot2
Si vous voulez faire pivoter le traceur à barres précédent, utilisez la fonction coord_flip
comme suit.
ggplot(data = df, aes(x = cyl, y = Freq)) + geom_bar(stat = "identity") + coord_flip() # Horizontal bar plot
.