web-dev-qa-db-fra.com

ggplot2: Mettre les étiquettes facet_wrap multi-variables sur une seule ligne

J'utilise facet_wrap pour diviser mon nuage de points comme

facet_wrap(x~y+z)

Cela génère 22 parcelles dans mon cas comme souhaité. Cependant, l'étiquette pour chacun de ces 22 graphiques est affichée sur 3 lignes (x, y et z), ce qui consomme inutilement l'espace dans la fenêtre et écrase les graphiques dans une petite zone. Je préférerais que mes parcelles soient plus grandes. Étant donné que les variables y et z sont courtes, je voudrais les afficher dans la même ligne au lieu de deux.

J'ai examiné les options d'étiqueteuse, mais aucune ne semble faire ce que je voudrais. J'apprécierais toute suggestion ici.

17
beeprogrammer

Dans ce cas, vous pouvez également envisager label_wrap_gen():

p <- ggplot(mtcars, aes(wt,mpg)) + geom_point() 
p + facet_wrap(cyl~am+vs, labeller = label_wrap_gen(multi_line=FALSE))

Pour plus de détails, voir aussi ici et ici .

19
nulptr

Je ne sais pas comment faire cela avec une fonction d'étiqueteuse, mais une autre option consiste à créer une variable de regroupement qui combine vos trois variables catégorielles en une seule variable qui peut être utilisée pour le facettage. Voici un exemple utilisant le cadre de données mtcars intégré et le package dplyr pour créer la nouvelle variable de regroupement à la volée. Ensuite, une mise à jour avec une fonction qui permet le choix dynamique d'une à trois variables de facettes.

library(dplyr)

ggplot(mtcars %>% mutate(group = paste(cyl,am,vs, sep="-")), 
       aes(wt,mpg)) +
  geom_point() +
  facet_wrap(~group)

enter image description here

MISE À JOUR: En ce qui concerne le commentaire sur la flexibilité, le code ci-dessous est une fonction qui permet à l'utilisateur d'entrer la trame de données et les noms de variables souhaités, y compris le choix dynamique de facette sur une, deux ou trois colonnes.

library(dplyr)
library(lazyeval)

mygg = function(dat, v1, v2, f1, f2=NA, f3=NA) {

  dat = dat %>% 
    mutate_(group = 
              if (is.na(f2)) {
                f1
              } else if (is.na(f3)) {
                interp(~paste(f1,f2, sep='-'), f1=as.name(f1), f2=as.name(f2))
              } else {
                interp(~paste(f1,f2,f3,sep='-'), f1=as.name(f1), f2=as.name(f2), f3=as.name(f3))
              })

  ggplot(dat, aes_string(v1,v2)) +
    geom_point() +
    facet_wrap(~group)
}

Essayons maintenant la fonction:

library(vcd) # For Arthitis data frame

mygg(Arthritis, "ID","Age","Sex","Treatment","Improved")
mygg(mtcars, "wt","mpg","cyl","am")
mygg(iris, "Petal.Width","Petal.Length","Species")

enter image description here

10
eipi10