Exemples de GGPLOT



Exemples de GGPLOT

Cet article fournit une galerie d’exemples de ggplots, notamment : des diagrammes de dispersion ou scatter plots, diagrammes de densité et histogrammes, diagrammes de barres et de lignes, barres d’erreur, box plots, violin plots et plus encore.



Sommaire:

Livre Apparenté

GGPLOT2 - L’Essentiel pour une Visualisation Magnifique des Données dans R

Prérequis

Charger les packages requis et définir la fonction thème theme_bw() comme thème par défaut:

library(tidyverse)
library(ggpubr) 
theme_set(
  theme_bw() + 
  theme(legend.position = "top")
  )

Diagramme de dispersion

  • Diagramme de dispersion basique avec coefficient de corrélation. La fonction stat_cor()[Package R ggpubr] est utilisée pour ajouter le coefficient de corrélation.
library("ggpubr")
p <- ggplot(mtcars, aes(mpg, wt)) +
  geom_point() +
  geom_smooth(method = lm) +
  stat_cor(method = "pearson", label.x = 20)
p

  • Zoom contextuel. Fonction R clé facet_zoom() [ggforce]
library(ggforce)
ggplot(iris, aes(Petal.Length, Petal.Width, colour = Species)) +
    geom_point() +
    facet_zoom(x = Species == "versicolor")

  • Encerclez quelques points. La fonction geom_encircle()[package R ggalt] peut être utilisée pour entourer un certain groupe de points
# Encerclez le groupe setosa
library("ggalt")
circle.df <- iris %>% filter(Species == "setosa")
ggplot(iris, aes(Petal.Length, Petal.Width)) +
    geom_point(aes(colour = Species)) + 
  geom_encircle(data = circle.df, linetype = 2)

  • Créez des points jitter pour éviter les chevauchements. Les points qui se chevauchent sont dispersés aléatoirement autour de leur position d’origine en fonction d’un seuil contrôlé par l’argument width dans la fonction geom_jitter()
# Diagramme de dispersion de base
ggplot(mpg, aes(cty, hwy)) +
  geom_point(size = 0.5)

# Points jitter (dispersés)
ggplot(mpg, aes(cty, hwy)) +
  geom_jitter(size = 0.5, width = 0.5)

  • Créez des graphiques de comptage pour éviter les chevauchements. Là où il y a plus de chevauchement de points, la taille du cercle augmente.
ggplot(mpg, aes(cty, hwy)) +
  geom_count()

  • Graphique à bulles. Dans un graphique à bulles (bubble chart), la taille des points est contrôlée par une variable continue, ici qsec.
ggplot(mtcars, aes(mpg, wt)) +
  geom_point(aes(size = qsec), alpha = 0.5) +
  scale_size(range = c(0.5, 12))  # Réglage de la plage de tailles des points

  • Graphiques de densité marginaux
library(ggpubr)
# Diagramme de dispersion groupé avec graphique de densité marginale
ggscatterhist(
  iris, x = "Sepal.Length", y = "Sepal.Width",
  color = "Species", size = 3, alpha = 0.6,
  palette = c("#00AFBB", "#E7B800", "#FC4E07"),
  margin.params = list(fill = "Species", color = "black", size = 0.2)
  )

# Utiliser le box plot comme graphiques marginaux
ggscatterhist(
  iris, x = "Sepal.Length", y = "Sepal.Width",
  color = "Species", size = 3, alpha = 0.6,
  palette = c("#00AFBB", "#E7B800", "#FC4E07"),
  margin.plot = "boxplot",
  ggtheme = theme_bw()
  )

Distribution

Diagramme de densité

  • Graphique de densité basique:
# Graphique de densité basique
ggplot(iris, aes(Sepal.Length)) +
  geom_density()

# Ajouter la ligne moyenne
ggplot(iris, aes(Sepal.Length)) +
  geom_density(fill = "lightgray") +
  geom_vline(aes(xintercept = mean(Sepal.Length)), linetype = 2)

  • Changer la couleur par groupe
# Modifier la couleur des lignes par groupe
ggplot(iris, aes(Sepal.Length, color = Species)) +
  geom_density() +
  scale_color_viridis_d()

# Ajouter une ligne moyenne par groupe
mu <- iris %>%
  group_by(Species) %>%
  summarise(grp.mean = mean(Sepal.Length))

ggplot(iris, aes(Sepal.Length, color = Species)) +
  geom_density() +
  geom_vline(aes(xintercept = grp.mean, color = Species),
             data = mu, linetype = 2) +
  scale_color_viridis_d()

Histogramme

  • Histogrammemes basiques
# Histogrammeme basique avec ligne moyenne
ggplot(iris, aes(Sepal.Length)) +
  geom_histogram(bins = 20, fill = "white", color = "black")  +
  geom_vline(aes(xintercept = mean(Sepal.Length)), linetype = 2)

# Ajouter des courbes de densité
ggplot(iris, aes(Sepal.Length, stat(density))) +
  geom_histogram(bins = 20, fill = "white", color = "black")  +
  geom_density() +
  geom_vline(aes(xintercept = mean(Sepal.Length)), linetype = 2)

  • Changer la couleur par groupe
ggplot(iris, aes(Sepal.Length)) +
  geom_histogram(aes(fill = Species, color = Species), bins = 20, 
                 position = "identity", alpha = 0.5) +
  scale_fill_viridis_d() +
  scale_color_viridis_d()

QQ Plot

library(ggpubr)
ggqqplot(iris, x = "Sepal.Length",
   ggtheme = theme_bw())

Distribution cumulative empirique (ECDF)

ggplot(iris, aes(Sepal.Length)) +
  stat_ecdf(aes(color = Species)) +
  scale_color_viridis_d()

Graphique de densité ridgeline

Le graphique de densité ridgeline est une alternative à la fonction standard geom_density() qui peut être utile pour visualiser les changements dans les distributions, d’une variable continue, dans le temps ou l’espace. Les graphiques ridgeline sont des line plots qui se chevauchent partiellement et donnent l’impression d’une chaîne de montagnes.

library(ggridges)
ggplot(iris, aes(x = Sepal.Length, y = Species)) +
  geom_density_ridges(aes(fill = Species)) +
  scale_fill_manual(values = c("#00AFBB", "#E7B800", "#FC4E07"))

Bar plots et alternatives

  • Data
df <- mtcars %>%
  rownames_to_column() %>%
  as_data_frame() %>%
  mutate(cyl = as.factor(cyl)) %>%
  select(rowname, wt, mpg, cyl)
df
## # A tibble: 32 x 4
##   rowname              wt   mpg cyl  
##   <chr>             <dbl> <dbl> <fct>
## 1 Mazda RX4          2.62  21   6    
## 2 Mazda RX4 Wag      2.88  21   6    
## 3 Datsun 710         2.32  22.8 4    
## 4 Hornet 4 Drive     3.22  21.4 6    
## 5 Hornet Sportabout  3.44  18.7 8    
## 6 Valiant            3.46  18.1 6    
## # … with 26 more rows
  • Bar plot basique
# Bar plot basique
ggplot(df, aes(x = rowname, y = mpg)) +
  geom_col() +
  rotate_x_text(angle = 45)

# Ordonner les noms de lignes par valeurs mpg
ggplot(df, aes(x = reorder(rowname, mpg), y = mpg)) +
  geom_col()  +
  rotate_x_text(angle = 45)

  • Bar plot horizontaux
# Bar plot horizontaux, 
# changer la couleur de remplissage par groupe et ajouter des étiquettes de texte
ggplot(df, aes(x = reorder(rowname, mpg), y = mpg)) +
  geom_col( aes(fill = cyl)) + 
  geom_text(aes(label = mpg), nudge_y = 2) + 
  coord_flip() +
  scale_fill_viridis_d()

  • Classer les barres par groupes et par valeurs mpg
df2 <- df %>% 
  arrange(cyl, mpg) %>%
  mutate(rowname = factor(rowname, levels = rowname))

ggplot(df2, aes(x = rowname, y = mpg)) +
  geom_col( aes(fill = cyl)) + 
  scale_fill_viridis_d() +
  rotate_x_text(45)

  • Graphique lollipop (sucette) : Lollipop est une alternative aux bar plots lorsque vous disposez de grands jeux de données.
ggplot(df2, aes(x = rowname, y = mpg)) +
  geom_segment(
    aes(x = rowname, xend = rowname, y = 0, yend = mpg), 
    color = "lightgray"
    ) + 
  geom_point(aes(color = cyl), size = 3) +
  scale_color_viridis_d() +
  theme_pubclean() +
  rotate_x_text(45)

  • Bar plot avec plusieurs groupes
# Data
df3 <- data.frame(supp=rep(c("VC", "OJ"), each=3),
                dose=rep(c("D0.5", "D1", "D2"),2),
                len=c(6.8, 15, 33, 4.2, 10, 29.5))


# Bar plot empilés de y = counts par x = cut,
# coloré par la variable
ggplot(df3, aes(x = dose, y = len)) +
  geom_col(aes(color = supp, fill = supp), position = position_stack()) +
  scale_color_manual(values = c("#0073C2FF", "#EFC000FF"))+
  scale_fill_manual(values = c("#0073C2FF", "#EFC000FF"))

# Utiliser position = position_dodge() 
ggplot(df3, aes(x = dose, y = len)) +
  geom_col(aes(color = supp, fill = supp), position = position_dodge(0.8), width = 0.7) +
  scale_color_manual(values = c("#0073C2FF", "#EFC000FF"))+
  scale_fill_manual(values = c("#0073C2FF", "#EFC000FF"))

Line plot

# Data
df3 <- data.frame(supp=rep(c("VC", "OJ"), each=3),
                dose=rep(c("D0.5", "D1", "D2"),2),
                len=c(6.8, 15, 33, 4.2, 10, 29.5))

# Line plot
ggplot(df3, aes(x = dose, y = len, group = supp)) +
  geom_line(aes(linetype = supp)) +
  geom_point(aes(shape = supp))

Barres d’erreur

  • Data
# Données brutes
df <- ToothGrowth %>% mutate(dose = as.factor(dose))
head(df, 3)
##    len supp dose
## 1  4.2   VC  0.5
## 2 11.5   VC  0.5
## 3  7.3   VC  0.5
# Statistiques descriptives
df.summary <- df %>%
  group_by(dose) %>%
  summarise(sd = sd(len, na.rm = TRUE), len = mean(len))
df.summary
## # A tibble: 3 x 3
##   dose     sd   len
##   <fct> <dbl> <dbl>
## 1 0.5    4.50  10.6
## 2 1      4.42  19.7
## 3 2      3.77  26.1
  • Line plots et bar plots basiques avec barres d’erreur
# (1) Line plot
ggplot(df.summary, aes(dose, len)) +
  geom_line(aes(group = 1)) +
  geom_errorbar( aes(ymin = len-sd, ymax = len+sd),width = 0.2) +
  geom_point(size = 2)

# (2) Bar plot
ggplot(df.summary, aes(dose, len)) +
  geom_bar(stat = "identity", fill = "lightgray", color = "black") +
  geom_errorbar(aes(ymin = len, ymax = len+sd), width = 0.2) 

  • Graphiques de lignes/barres groupées
# Préparation des données
df.summary2 <- df %>%
  group_by(dose, supp) %>%
  summarise( sd = sd(len), len = mean(len))
df.summary2
## # A tibble: 6 x 4
## # Groups:   dose [3]
##   dose  supp     sd   len
##   <fct> <fct> <dbl> <dbl>
## 1 0.5   OJ     4.46 13.2 
## 2 0.5   VC     2.75  7.98
## 3 1     OJ     3.91 22.7 
## 4 1     VC     2.52 16.8 
## 5 2     OJ     2.66 26.1 
## 6 2     VC     4.80 26.1
# (1) Line plot + barres d'erreur
ggplot(df.summary2, aes(dose, len)) +
  geom_line(aes(linetype = supp, group = supp))+
  geom_point()+
  geom_errorbar(
    aes(ymin = len-sd, ymax = len+sd, group = supp),
     width = 0.2
    )

# (2) Bar plots + barres d'erreur supérieures.
ggplot(df.summary2, aes(dose, len)) +
  geom_bar(aes(fill = supp), stat = "identity",
           position = position_dodge(0.8), width = 0.7)+
  geom_errorbar(
    aes(ymin = len, ymax = len+sd, group = supp),
    width = 0.2, position = position_dodge(0.8)
    )+
  scale_fill_manual(values = c("grey80", "grey30"))

Box plots et alternatives

  • Data
ToothGrowth$dose <- as.factor(ToothGrowth$dose)
  • Box plots basique
# Basique
ggplot(ToothGrowth, aes(dose, len)) +
  geom_boxplot()

# Box plot + violon plot
ggplot(ToothGrowth, aes(dose, len)) +
  geom_violin(trim = FALSE) +
  geom_boxplot(width = 0.2)

  • Ajoutez des points jitter et des dot plot
# Ajouter des points dispersés (jitter)
ggplot(ToothGrowth, aes(dose, len)) +
  geom_boxplot() +
  geom_jitter(width = 0.2)

# Dot plot + box plot
ggplot(ToothGrowth, aes(dose, len)) +
  geom_boxplot() +
  geom_dotplot(binaxis = "y", stackdir = "center")

  • Plots groupés
# Box plots
ggplot(ToothGrowth, aes(dose, len)) +
  geom_boxplot(aes(color = supp)) +
  scale_color_viridis_d()

# Ajouter des points dispersés (jitter)
ggplot(ToothGrowth, aes(dose, len, color = supp)) +
  geom_boxplot() +
  geom_jitter(position = position_jitterdodge(jitter.width = 0.2)) +
  scale_color_viridis_d()

Visualisation de données de séries temporelles

# Préparation des données
df <- economics %>%
  select(date, psavert, uempmed) %>%
  gather(key = "variable", value = "value", -date)
head(df, 3)
## # A tibble: 3 x 3
##   date       variable value
##   <date>     <chr>    <dbl>
## 1 1967-07-01 psavert   12.6
## 2 1967-08-01 psavert   12.6
## 3 1967-09-01 psavert   11.9
# Graphique à lignes multiples
ggplot(df, aes(x = date, y = value)) + 
  geom_line(aes(color = variable), size = 1) +
  scale_color_manual(values = c("#00AFBB", "#E7B800")) +
  theme_minimal()

matrice de diagramme de dispersion

library(GGally)
ggpairs(iris[,-5])+ theme_bw()

Analyse de corrélation

library("ggcorrplot")
# Calculer une matrice de corrélation
my_data <- mtcars[, c(1,3,4,5,6,7)]
corr <- round(cor(my_data), 1)
# Visualiser
ggcorrplot(corr, p.mat = cor_pmat(my_data),
           hc.order = TRUE, type = "lower",
           color = c("#FC4E07", "white", "#00AFBB"),
           outline.col = "white", lab = TRUE)

Analyse de cluster

library(factoextra)
USArrests %>%
  scale() %>%                           # Mettre les données à l'échelle
  dist() %>%                            # Calculer la matrice de distance
  hclust(method = "ward.D2") %>%        # Cluster hiérarchique
  fviz_dend(cex = 0.5, k = 4, palette = "jco") # Visualiser et couper 
                                              # en 4 Groupes

Balloon plot

Le Balloon plot (ou graphique en ballon) est une alternative aux bar plots pour visualiser une grande quantité de données catégorielles.

library(ggpubr)
# Préparation des données
housetasks <- read.delim(
  system.file("demo-data/housetasks.txt", package = "ggpubr"),
  row.names = 1
  )
head(housetasks, 4)
##            Wife Alternating Husband Jointly
## Laundry     156          14       2       4
## Main_meal   124          20       5       4
## Dinner       77          11       7      13
## Breakfeast   82          36      15       7
# Visualisation
ggballoonplot(housetasks, fill = "value")+
  scale_fill_viridis_c(option = "C")



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