Magnifique Graphique Radar dans R avec les Packages FMSB et GGPlot



Magnifique Graphique Radar dans R avec les Packages FMSB et GGPlot

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 variables
    • vlcex: contrôle la taille de la police des étiquettes variables
  • Options de polygone:
    • pcol: couleur de la ligne
    • pfcol: couleur de remplissage
    • plwd: largeur de ligne
    • plty: 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, utilisez plty = 0 ou plty = “blank”.
  • Options de grille:
    • cglcol: couleur de la ligne
    • cglty: type de ligne
    • cglwd: 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.

  1. 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
  1. 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
  1. 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
  1. 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 groupe
  • values.radar: les valeurs à indiquer aux lignes de grille minimales, moyennes et maximales
  • grid.min: valeur à laquelle la ligne de grille minimale est représentée
  • grid.mid: valeur à laquelle la ligne moyenne de la grille est représentée
  • grid.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

Give a comment

Want to post an issue with R? If yes, please make sure you have read this: How to Include Reproducible R Script Examples in Datanovia Comments