Un graphique radar, également appelé graphique araignée, est utilisé pour visualiser les valeurs ou les scores attribués à un individu sur plusieurs variables quantitatives, où chaque variable correspond à un axe spécifique.
Cet article décrit comment créer un graphique radar dans R en utilisant deux packages R différents : fmsb
et ggradar
.
Notez que le graphique radar fmsb est un graphique R basic. Le package ggradar
crée un graphique radar ggplot.
Vous apprendrez:
- comment créer un beau graphique radar fmsb
- comment créer un graphique radar avec ggplot
- les alternatives aux graphiques radar
Sommaire:
Données de démonstration
Nous utiliserons une donnée de démonstration contenant les notes d’examen de 3 étudiants sur 9 sujets (Biologie, Physique, etc). Les notes vont de 0 à 20. Les colonnes sont des variables quantitatives et les lignes sont des individus.
# Données de démonstration
exam_scores <- data.frame(
row.names = c("Student.1", "Student.2", "Student.3"),
Biology = c(7.9, 3.9, 9.4),
Physics = c(10, 20, 0),
Maths = c(3.7, 11.5, 2.5),
Sport = c(8.7, 20, 4),
English = c(7.9, 7.2, 12.4),
Geography = c(6.4, 10.5, 6.5),
Art = c(2.4, 0.2, 9.8),
Programming = c(0, 0, 20),
Music = c(20, 20, 20)
)
exam_scores
## Biology Physics Maths Sport English Geography Art Programming Music
## Student.1 7.9 10 3.7 8.7 7.9 6.4 2.4 0 20
## Student.2 3.9 20 11.5 20.0 7.2 10.5 0.2 0 20
## Student.3 9.4 0 2.5 4.0 12.4 6.5 9.8 20 20
graphique radar fmsb
Prérequis
Installez le package R fmsb
:
install.packages("fmsb")
Charger le package:
library(fmsb)
Préparation des données
Les données doivent être organisées comme suit:
- La ligne 1 doit contenir les valeurs maximales de chaque variable
- La ligne 2 doit contenir les valeurs minimales de chaque variable
- Les données relatives aux cas ou aux personnes doivent être indiquées à partir de la ligne 3
- Le nombre de colonnes ou de variables doit être supérieur à 2.
# Définir les intervalles des variables : maximum et minimum
max_min <- data.frame(
Biology = c(20, 0), Physics = c(20, 0), Maths = c(20, 0),
Sport = c(20, 0), English = c(20, 0), Geography = c(20, 0),
Art = c(20, 0), Programming = c(20, 0), Music = c(20, 0)
)
rownames(max_min) <- c("Max", "Min")
# Rattacher les plages de variables aux données
df <- rbind(max_min, exam_scores)
df
## Biology Physics Maths Sport English Geography Art Programming Music
## Max 20.0 20 20.0 20.0 20.0 20.0 20.0 20 20
## Min 0.0 0 0.0 0.0 0.0 0.0 0.0 0 0
## Student.1 7.9 10 3.7 8.7 7.9 6.4 2.4 0 20
## Student.2 3.9 20 11.5 20.0 7.2 10.5 0.2 0 20
## Student.3 9.4 0 2.5 4.0 12.4 6.5 9.8 20 20
Graphique radar de base
# Représentez les données pour l'élève 1
library(fmsb)
student1_data <- df[c("Max", "Min", "Student.1"), ]
radarchart(student1_data)
On peut constater que l’étudiant 1 a un score élevé en musique et en physique par rapport aux autres sujets.
Personnaliser les graphiques radar
Principaux arguments pour personnaliser les différentes composantes du graphique radar fmsb
:
- Options variables
vlabels
: étiquettes des variablesvlcex
: contrôle la taille de la police des étiquettes variables
- Options de polygone:
pcol
: couleur de la lignepfcol
: couleur de remplissageplwd
: largeur de ligneplty
: types de lignes. Peut être un tableau numérique 1:6 ou un tableau de caractères c (“solid”, “dashed”, “dotdash”, “dotdash”, “longdash”, “twodash”). Pour supprimer la ligne, utilisezplty = 0
ouplty = “blank”
.
- Options de grille:
cglcol
: couleur de la lignecglty
: type de lignecglwd
: largeur de ligne
- Options des axes:
axislabcol
: couleur de l’étiquette de l’axe et numéros. La valeur par défaut est “bleu”.caxislabels
: Vecteur de caractères à utiliser comme étiquettes sur l’axe central.
Fonction d’aide pour produire un beau graphique radar:
create_beautiful_radarchart <- function(data, color = "#00AFBB",
vlabels = colnames(data), vlcex = 0.7,
caxislabels = NULL, title = NULL, ...){
radarchart(
data, axistype = 1,
# Personnaliser le polygone
pcol = color, pfcol = scales::alpha(color, 0.5), plwd = 2, plty = 1,
# Personnaliser la grille
cglcol = "grey", cglty = 1, cglwd = 0.8,
# Personnaliser l'axe
axislabcol = "grey",
# Étiquettes des variables
vlcex = vlcex, vlabels = vlabels,
caxislabels = caxislabels, title = title, ...
)
}
Dans le code ci-dessus, nous avons utilisé la fonction alpha()
[dans le package scales] pour changer la transparence de la couleur de remplissage du polygone.
# Réduire la marge du graphique à l'aide de par()
op <- par(mar = c(1, 2, 2, 1))
create_beautiful_radarchart(student1_data, caxislabels = c(0, 5, 10, 15, 20))
par(op)
Créer des graphiques radar pour plusieurs individus
Créer le graphique radar des trois élèves sur le même graphique:
# Réduire la marge du graphique à l'aide de par()
op <- par(mar = c(1, 2, 2, 2))
# Créer les graphiques radar
create_beautiful_radarchart(
data = df, caxislabels = c(0, 5, 10, 15, 20),
color = c("#00AFBB", "#E7B800", "#FC4E07")
)
# Ajouter une légende horizontale
legend(
x = "bottom", legend = rownames(df[-c(1,2),]), horiz = TRUE,
bty = "n", pch = 20 , col = c("#00AFBB", "#E7B800", "#FC4E07"),
text.col = "black", cex = 1, pt.cex = 1.5
)
par(op)
Créer des diagrammes araignées séparés pour chaque individu. Ceci est recommandé lorsque vous avez plus de 3 séries.
# Définir les couleurs et les titres
colors <- c("#00AFBB", "#E7B800", "#FC4E07")
titles <- c("Student.1", "Student.2", "Student.3")
# Réduire la marge du graphique à l'aide de par()
# Diviser l'écran en 3 parties
op <- par(mar = c(1, 1, 1, 1))
par(mfrow = c(1,3))
# Créer le graphique radar
for(i in 1:3){
create_beautiful_radarchart(
data = df[c(1, 2, i+2), ], caxislabels = c(0, 5, 10, 15, 20),
color = colors[i], title = titles[i]
)
}
par(op)
Comparer chaque profil à un profil moyen
Les graphiques radar sont plus utiles si le profil de chaque individu est comparé à un profil moyen.
- Créer des données de demo contenant les notes d’examen de 10 étudiants:
set.seed(123)
df <- as.data.frame(
matrix(sample(2:20 , 90 , replace = TRUE),
ncol=9, byrow = TRUE)
)
colnames(df) <- c(
"Biology", "Physics", "Maths", "Sport", "English",
"Geography", "Art", "Programming", "Music"
)
rownames(df) <- paste0("Student.", 1:nrow(df))
head(df)
## Biology Physics Maths Sport English Geography Art Programming Music
## Student.1 16 20 15 4 11 19 12 6 15
## Student.2 6 20 10 4 9 8 11 10 20
## Student.3 5 15 18 12 8 13 16 11 14
## Student.4 8 10 10 11 8 7 3 6 9
## Student.5 13 14 19 2 7 16 10 16 17
## Student.6 7 12 9 8 17 18 19 18 3
- Normaliser chaque variable pour qu’elle soit comprise entre 0 et 1:
library(scales)
df_scaled <- round(apply(df, 2, scales::rescale), 2)
df_scaled <- as.data.frame(df_scaled)
head(df_scaled)
## Biology Physics Maths Sport English Geography Art Programming Music
## Student.1 1.00 1.00 0.69 0.11 0.47 1.00 0.56 0.00 0.71
## Student.2 0.09 1.00 0.31 0.11 0.35 0.27 0.50 0.33 1.00
## Student.3 0.00 0.69 0.92 0.56 0.29 0.60 0.81 0.42 0.65
## Student.4 0.27 0.38 0.31 0.50 0.29 0.20 0.00 0.00 0.35
## Student.5 0.73 0.62 1.00 0.00 0.24 0.80 0.44 0.83 0.82
## Student.6 0.18 0.50 0.23 0.33 0.82 0.93 1.00 1.00 0.00
- Préparer les données pour créer le graphique radar à l’aide du package
fmsb
:
# Descriptif des variables
# Obtenir le minimum et le maximum de chaque colonne
col_max <- apply(df_scaled, 2, max)
col_min <- apply(df_scaled, 2, min)
# Calculer le profil moyen
col_mean <- apply(df_scaled, 2, mean)
# Rassembler le descriptif des colonnes
col_summary <- t(data.frame(Max = col_max, Min = col_min, Average = col_mean))
# Rattacher le descriptif des variables aux données
df_scaled2 <- as.data.frame(rbind(col_summary, df_scaled))
head(df_scaled2)
## Biology Physics Maths Sport English Geography Art Programming Music
## Max 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.00 1.000
## Min 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.00 0.000
## Average 0.464 0.575 0.476 0.427 0.423 0.587 0.544 0.50 0.629
## Student.1 1.000 1.000 0.690 0.110 0.470 1.000 0.560 0.00 0.710
## Student.2 0.090 1.000 0.310 0.110 0.350 0.270 0.500 0.33 1.000
## Student.3 0.000 0.690 0.920 0.560 0.290 0.600 0.810 0.42 0.650
- Produire des graphiques radar montrant à la fois le profil moyen et le profil individuel:
opar <- par()
# Définir les paramètres graphiques dans une grille 3x4, avec des marges appropriées:
par(mar = rep(0.8,4))
par(mfrow = c(3,4))
# Produire un graphique radar pour chaque élève
for (i in 4:nrow(df_scaled2)) {
radarchart(
df_scaled2[c(1:3, i), ],
pfcol = c("#99999980",NA),
pcol= c(NA,2), plty = 1, plwd = 2,
title = row.names(df_scaled2)[i]
)
}
# Restaurer les paramètres standard de par()
par <- par(opar)
graphique radar ggplot utilisant le package R ggradar
Prérequis
Installation:
devtools::install_github("ricardo-bion/ggradar")
Chargement du package:
library("ggradar")
Fonction et arguments clés
ggradar(
plot.data, values.radar = c("0%", "50%", "100%"),
grid.min = 0, grid.mid = 0.5, grid.max = 1,
)
plot.data
: les données contenant une ligne par individu ou groupevalues.radar
: les valeurs à indiquer aux lignes de grille minimales, moyennes et maximalesgrid.min
: valeur à laquelle la ligne de grille minimale est représentéegrid.mid
: valeur à laquelle la ligne moyenne de la grille est représentéegrid.max
: valeur à laquelle la ligne de grille maximale est représentée
Préparation des données
Toutes les variables des données doivent être à la même échelle. Si ce n’est pas le cas, vous devez normaliser les données.
Par exemple, vous pouvez normaliser les variables pour qu’elles aient un minimum de 0 et un maximum de 1 en utilisant la fonction rescale()
[scales package]. Nous décrirons cette méthode dans les prochaines sections.
library(tidyverse)
# Mettre les noms des lignes dans un groupe nommé colonne
df <- exam_scores %>% rownames_to_column("group")
df
## group Biology Physics Maths Sport English Geography Art Programming Music
## 1 Student.1 7.9 10 3.7 8.7 7.9 6.4 2.4 0 20
## 2 Student.2 3.9 20 11.5 20.0 7.2 10.5 0.2 0 20
## 3 Student.3 9.4 0 2.5 4.0 12.4 6.5 9.8 20 20
Graphique radar de base
# Représentation graphique de l'élève 1
ggradar(
df[1, ],
values.radar = c("0", "10", "20"),
grid.min = 0, grid.mid = 10, grid.max = 20
)
Personnaliser les graphiques radar
Principaux arguments pour personnaliser les différentes composantes du graphique radar ggplot. Pour plus d’options, voir la documentation.
ggradar(
df[1, ],
values.radar = c("0", "10", "20"),
grid.min = 0, grid.mid = 10, grid.max = 20,
# Polygones
group.line.width = 1,
group.point.size = 3,
group.colours = "#00AFBB",
# Arrière-plan et lignes de grille
background.circle.colour = "white",
gridline.mid.colour = "grey"
)
Graphique radar avec plusieurs individus ou groupes
Créer le graphique radar des trois élèves sur le même graphique:
ggradar(
df,
values.radar = c("0", "10", "20"),
grid.min = 0, grid.mid = 10, grid.max = 20,
# Polygones
group.line.width = 1,
group.point.size = 3,
group.colours = c("#00AFBB", "#E7B800", "#FC4E07"),
# Arrière-plan et lignes de grille
background.circle.colour = "white",
gridline.mid.colour = "grey",
legend.position = "bottom"
)
Alternatives aux graphiques radar
Un graphique circulaire est difficile à lire. Une alternative à un graphique radar est une lolliplot (graphique sucette) ou un dotchart. Cette section décrit comment créer des dotcharts. Le package R ggpubr
sera utilisé dans cette section pour créer un dotchart.
Charger les packages requis:
library(tidyverse)
library(ggpubr)
Cas où toutes les variables quantitatives ont la même échelle
Affichage d’un individu
Préparation des données:
df2 <- t(exam_scores) %>%
as.data.frame() %>%
rownames_to_column("Field")
df2
## Field Student.1 Student.2 Student.3
## 1 Biology 7.9 3.9 9.4
## 2 Physics 10.0 20.0 0.0
## 3 Maths 3.7 11.5 2.5
## 4 Sport 8.7 20.0 4.0
## 5 English 7.9 7.2 12.4
## 6 Geography 6.4 10.5 6.5
## 7 Art 2.4 0.2 9.8
## 8 Programming 0.0 0.0 20.0
## 9 Music 20.0 20.0 20.0
Représentation graphique:
ggdotchart(
df2, x = "Field", y = "Student.1",
add = "segments", sorting = "descending",
ylab = "Exam Score", title = "Student 1"
)
Affichage de deux individus
Préparation des données:
df3 <- df2 %>%
select(Field, Student.1, Student.2) %>%
pivot_longer(
cols = c(Student.1, Student.2),
names_to = "student",
values_to = "value"
)
head(df3)
## # A tibble: 6 x 3
## Field student value
## <chr> <chr> <dbl>
## 1 Biology Student.1 7.9
## 2 Biology Student.2 3.9
## 3 Physics Student.1 10
## 4 Physics Student.2 20
## 5 Maths Student.1 3.7
## 6 Maths Student.2 11.5
Représentation graphique:
ggdotchart(
df3, x = "Field", y = "value",
group = "student", color = "student", palette = "jco",
add = "segment", position = position_dodge(0.3),
sorting = "descending"
)
Affichage de plusieurs individus
Préparation des données:
df4 <- df2 %>%
select(Field, Student.1, Student.2, Student.3) %>%
pivot_longer(
cols = c(Student.1, Student.2, Student.3),
names_to = "student",
values_to = "value"
)
head(df4)
## # A tibble: 6 x 3
## Field student value
## <chr> <chr> <dbl>
## 1 Biology Student.1 7.9
## 2 Biology Student.2 3.9
## 3 Biology Student.3 9.4
## 4 Physics Student.1 10
## 5 Physics Student.2 20
## 6 Physics Student.3 0
Représentation graphique:
ggdotchart(
df4, x = "Field", y = "value",
group = "student", color = "student", palette = "jco",
add = "segment", position = position_dodge(0.3),
sorting = "descending", facet.by = "student",
rotate = TRUE, legend = "none"
)
Cas où vous avez beaucoup d’individus à représenter ou si vos variables ont des échelles différentes
Une solution consiste à créer un graphique de coordonnées parallèles.
library(GGally)
ggparcoord(
iris,
columns = 1:4, groupColumn = 5, order = "anyClass",
showPoints = TRUE,
title = "Parallel Coordinate Plot for the Iris Data",
alphaLines = 0.3
) +
theme_bw() +
theme(legend.position = "top")
Notez que, par défaut, la fonction ggparcoord()
normalise chaque variable en soustrayant la moyenne et en divisant par l’écart-type.
Conclusion
Cet article décrit comment créer un graphique radar dans R pour un ou plusieurs individus en utilisant le package fmsb et le package ggradar (une extension de ggplot2).
Version: English
No Comments