ajuster taille du graphique ggplot2

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

David Hacquard
Messages : 31
Enregistré le : 14 Mai 2020, 07:52

ajuster taille du graphique ggplot2

Messagepar David Hacquard » 17 Mar 2021, 07:54

Bonjour,

Voici un exemple de ce que pourrait être mon jeu de données :

Code : Tout sélectionner

df <- data.frame(k1 = c("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"),
                 k2 = c(1,5,0,12,5,10,4,5,6,7,8,2,14,20,1,5,1,8,7,6,3,6,4,5,8,3))


ggplot(df) +
  aes(x = k1, y = k2, fill = k2, na.rm = T) +
  geom_bar(stat='identity')+
  geom_text(aes(label = k2), position = position_stack(vjust = 0.5), size = 3)




Avec cette série de données le graphique reste visible mais il arrive que la variable "k1" ait plus de 50 observations différentes. Dans ce cas le graphique n'est plus visible.

Comment faire en sorte que le graphique s'ajuste automatiquement (en se divisant en plusieurs parties par exemple ?) lorsque le nombre d'observations devient trop important ?

Merci.
David

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: ajuster taille du graphique ggplot2

Messagepar Pierre-Yves Berrard » 17 Mar 2021, 08:23

Bonjour,

Un exemple de structure de programme :

Code : Tout sélectionner

# tronc commun du graphique
mon_graphique <- ggplot(df) + ...

# spécificités si trop de modalités
if (length(unique(df$k1)) > 50) {
  mon_graphique <- mon_graphique + facet_wrap(...) + ...
PY

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: ajuster taille du graphique ggplot2

Messagepar Mickael Canouil » 17 Mar 2021, 08:32

Bonjour,

La taille n'existe pas (en dehors d'un export).
C'est un paramètre lors de l'export sur un périphérique graphique et dépend pour les périphériques type "raster" (comme png, jpg), de la résolution, de la hauteur et de la largeur de l'image. Pour les périphériques vectorielles (svg, emf, eps, etc.), uniquement de la dimension physique dans le système métrique/impériale (ou en pixel).

Est-ce pertinent d'avoir un graphique de 50 cm de large ?

Code : Tout sélectionner

df <- data.frame(
  k1 = c("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"),
  k2 = c(1,5,0,12,5,10,4,5,6,7,8,2,14,20,1,5,1,8,7,6,3,6,4,5,8,3)
)

library("ggplot2")
<- ggplot(df) +
  aes(= k1, y = k2, fill = k2, na.rm = TRUE) +
  geom_col() +
  geom_text(aes(label = k2), position = position_stack(vjust = 0.5), size = 3)

Par exemple avec {ragg} pour générer des fichiers png via agg.

Code : Tout sélectionner

library("ragg")
agg_png(filename = "file.png", width = 8, height = 6, units = "cm", res = 120)
  print(p)
invisible(dev.off())

Image

Code : Tout sélectionner

library("ragg")
agg_png(filename = "file.png", width = length(p$data[["k1"]]) / 13 * 8, height = 6, units = "cm", res = 120)
  print(p)
invisible(dev.off())

Image

EDIT : J'avais aussi pensé à facet_wrap() comme Pierre-Yves le propose, mais cela déplace le problème d'une dimension à deux dimensions.
Un mélange des deux approches serait potentiellement le mieux dans beaucoup de cas.

EDIT2 : Une autre approche pour générer des morceaux de graphiques indépendants.
Les graphiques sont combinable multipage avec pdf() par exemple pour la sortie, ou en mode {patchwork} (wrap_plots(lp)).

Code : Tout sélectionner

df <- data.frame(
  k1 = c("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"),
  k2 = c(1,5,0,12,5,10,4,5,6,7,8,2,14,20,1,5,1,8,7,6,3,6,4,5,8,3)

Image

Code : Tout sélectionner

library(ggplot2)
<- ggplot(df) +
  aes(= k1, y = k2, fill = k2, na.rm = TRUE) +
  geom_col() +
  geom_text(aes(label = k2), position = position_stack(vjust = 0.5), size = 3

Code : Tout sélectionner

lp <- lapply(
  X = split(
    x = df, 
    f 
= cut(
      x = rank(df[["k1"]]), 
      breaks 
= c(seq(from = 0, to = nrow(df), by = 13), Inf), 
      include
.lowest = TRUE
    
)
  ),
  .plot = p,
  FUN = function(.x, .plot) {
    .plot$data <- .x
    
.plot
  
}
)

Code : Tout sélectionner

lp[[1]]

Image

Code : Tout sélectionner

lp[[2]] 

Image


Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

David Hacquard
Messages : 31
Enregistré le : 14 Mai 2020, 07:52

Re: ajuster taille du graphique ggplot2

Messagepar David Hacquard » 17 Mar 2021, 10:44

Bonjour Pierre-Yves,

Que mettre dans facet_wrap(...) pour que le graphique soit divisé en deux ?
merci

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: ajuster taille du graphique ggplot2

Messagepar Pierre-Yves Berrard » 17 Mar 2021, 11:02

Il faut certainement créer une variable de regroupement dans les données :

Code : Tout sélectionner

df <- data.frame(k1 = letters, 
                 k2 
= c(1,5,0,12,5,10,4,5,6,7,8,2,14,20,1,5,1,8,7,6,3,6,4,5,8,3),
                 k1_regroup = rep(1:2, 13))
                
ggplot
(df) + 
  aes
(= k1, y = k2, fill = k2, na.rm = TRUE) +
  geom_bar(stat = "identity") + 
  facet_wrap
(~ k1_regroup, nrow = 2, scales = "free_x"
PY

David Hacquard
Messages : 31
Enregistré le : 14 Mai 2020, 07:52

Re: ajuster taille du graphique ggplot2

Messagepar David Hacquard » 17 Mar 2021, 11:13

Bonjour Mickael,

Votre deuxième proposition semble répondre à mon problème mais il me reste deux questions que je n'arrive pas à élucider :

Prenons ce nouveau jeu de données :

Code : Tout sélectionner

df <- data.frame(k1 = c(2,2,10,8,5,4,44,5,6,17,18,2,64,31,1,35,11,28,17,16,3,26,44,25,28,13),
                 k2 = c(1,5,0,12,5,10,4,5,6,7,8,2,14,20,1,5,1,8,7,6,3,6,4,5,8,3))

df[,'k1'] <- as.factor((df[,'k1']))

p <- ggplot(df) +
  aes(x = k1, y = k2, fill = k2, na.rm = T) +
  geom_bar(stat='identity')+
  geom_text(aes(label = k2), position = position_stack(vjust = 0.5), size = 3)


lp <- lapply(
  X = split(
    x = df,
    f = cut(
      x = rank(df[["k1"]]),
      breaks = c(seq(from = 0, to = nrow(df), by = 15), Inf),
      include.lowest = TRUE
    )
  ),
  .plot = p,
  FUN = function(.x, .plot) {
    .plot$data <- .x
    .plot
  }
)

lp[[1]]


Comment diviser le graphique selon 15 variables et non pas selon le nombre d'observations de k1 ?

Comment afficher automatiquement les graphiques, quel que soit leur nombre, sans devoir les appeler indépendamment : "lp[[1]], lp[[2]], lp[[x]],..." ?

Merci,
David

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: ajuster taille du graphique ggplot2

Messagepar Mickael Canouil » 17 Mar 2021, 11:19

David Hacquard a écrit :Comment diviser le graphique selon 15 variables et non pas selon le nombre d'observations de k1 ?

Qu'appelez-vous variable ? Votre exemple (pas reproductible au passage puisqu'il manque les extensions R) ne montre que les variables (au sens usuelle de R) k1 et k2.
David Hacquard a écrit :Comment afficher automatiquement les graphiques, quel que soit leur nombre, sans devoir les appeler indépendamment : "lp[[1]], lp[[2]], lp[[x]],..." ?

Qu'entendez-vous par "afficher" ? lp vous affichera littéralement tous les éléments de la liste, les uns après les autres.

PS : geom_col() en lieu et place de geom_bar(stat = "identity")
Mickaël
mickael.canouil.fr | rlille.fr

David Hacquard
Messages : 31
Enregistré le : 14 Mai 2020, 07:52

Re: ajuster taille du graphique ggplot2

Messagepar David Hacquard » 17 Mar 2021, 11:33

Je me suis mal exprimé, j'aimerai afficher 15 valeurs sur l'axe des abscisses par graphique et non pas afficher 15 observations par graphique. Dans le jeu de données plusieurs valeurs de k1 sont identiques, je n'aimerai prendre que les valeurs différentes pour le décompte des 15 valeurs afficher en abscisse (pas sûr que ce soit beaucoup plus clair).

Effectivement lp avait bien marché pour afficher les graphiques.

Merci,
David

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: ajuster taille du graphique ggplot2

Messagepar Mickael Canouil » 17 Mar 2021, 12:13

Voici un exemple/proposition reproductible (hors seed):

Code : Tout sélectionner

df <- data.frame(
  k1 = factor(sample(1:50, 100, TRUE)),
  k2 = floor(runif(= 100, min = 0, max = 10))

Code : Tout sélectionner

library("ggplot2")
plot_all_x <- ggplot(df) +
  aes(= k1, y = k2, fill = k2, na.rm = TRUE) +
  geom_col() +
  geom_text(aes(label = k2), position = position_stack(vjust = 0.5), size = 3)

plot_all_x

Image

Code : Tout sélectionner

lp <- lapply(
  X = split(
    x = df, 
    f 
= cut(
      x = as.integer(df[["k1"]]), 
      breaks 
= c(seq(from = 0, to = nlevels(df[["k1"]]), by = 15), Inf), 
      include
.lowest = TRUE
    
)
  ),
  FUN = function(.df) {
    if (nrow(.df) == 0) return(NULL)
    ggplot(.df) +
      aes(= k1, y = k2, fill = k2, na.rm = TRUE) +
      geom_col() +
      geom_text(aes(label = k2), position = position_stack(vjust = 0.5), size = 3)
  }
)
lp[!is.null(lp)] 

Code : Tout sélectionner

#> $`[0,15]`   

Image

Code : Tout sélectionner

#> $`(15,30]`   

Image

Code : Tout sélectionner

#> $`(30,Inf]`   

Image
Mickaël
mickael.canouil.fr | rlille.fr

David Hacquard
Messages : 31
Enregistré le : 14 Mai 2020, 07:52

Re: ajuster taille du graphique ggplot2

Messagepar David Hacquard » 17 Mar 2021, 13:00

Merci beaucoup.

David


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité