Barplot et facet wrap

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

Romain Fleury
Messages : 10
Enregistré le : 03 Nov 2014, 12:57

Barplot et facet wrap

Messagepar Romain Fleury » 26 Aoû 2015, 09:03

Bonjour,

Je souhaite produire un histogramme avec ggplot2 en ordonnant les valeurs . Voici un tableau type :

Code : Tout sélectionner

ddf <- data.frame(type=c("B","B","B","B","A","A","A"),
      label=c("station1","station2","station3","station4","station1","station2","station3"),
      value=c(1,3,2,10,6,8,0.5))


et le type de graphe que je souhaite obtenir :

Code : Tout sélectionner

ddf$x <-factor(ddf$label, levels=unique(ddf[order(ddf$type,ddf$value), "label"]))
p <- ggplot(ddf) +
geom_bar(aes(x=x,y=value),stat="identity",width=0.5,fill="#1f78b4")+
facet_wrap(~type,nrow = 2,scales = "free")
p


l'ordre est respecté sur le premier histogramme, pas sur le deuxième. Les labels de x ne sont pas uniques, ce qui semble poser problème à ggplot. Le résultat attendu est :

Code : Tout sélectionner

  ddf$label=make.unique(as.character(ddf$label))
  ddf$x <-factor(ddf$label, levels=unique(ddf[order(ddf$type,ddf$value), "label"]))
  p <- ggplot(ddf) +
  geom_bar(aes(x=x,y=value),stat="identity",width=0.5,fill="#1f78b4")+
  facet_wrap(~type,nrow = 2,scales = "free")
  p


Que faudrait il pour remédier simplement à ce problème, sans générer les graphes un à un et utiliser

Code : Tout sélectionner

 grid.arrange
, et sans changer le nom des labels x utilisés ?

Merci de vos réponses,

Navarre Julien
Messages : 367
Enregistré le : 20 Avr 2012, 08:27

Re: Barplot et facet wrap

Messagepar Navarre Julien » 26 Aoû 2015, 12:32

Bonjour, l'ordre des barres est définit par l'ordre des levels du facteur. Quand tu as ordonné tes facteurs tu l'as fait en fonction des valeurs de tous les types confondus, si tu t’intéresse à un type en particulier ce ne sera peut être plus le même ordre mais ggplot ne peut pas le savoir et se base sur l'ordre des facteurs de la variable de départ.

Pour essayer de faire quelque chose qui dépend de la variable de groupe, il va falloir recoder les facteurs obligatoirement. Mais on peut utiliser des astuces pour que ça ne se voit pas à l'écran ensuite. Par exemple au lieu d'utiliser make.unique qui ajoute un indice visible, tu peux faire une sorte de make.unique qui rend unique en ajoutant des espaces, invisibles donc, au lieu d'indices.

Sinon en utilisant make.unique tu peux simplement recoder les labels ensuite en te servant de ceux initiaux, cette solution est peut être plus élégante.

Code : Tout sélectionner

ddf <- data.frame(type=c("B","B","B","B","A","A","A"),
                  label=c("station1","station2","station3","station4","station1","station2","station3"),
                  value=c(1,3,2,10,6,8,0.5))

n <- as.integer(as.factor(ddf$type))

x <- sapply(seq_along(n), function(i)
  paste(rep(" ", n[i] - 1L), ddf$label[i], sep = ""))

ddf$x <- factor(x, levels = x[order(ddf$value)])

ggplot(ddf) +
  geom_bar(aes(x = x, y = value), stat = "identity",
           width = 0.5, fill = "#1f78b4") +
  facet_wrap(~type, nrow = 2, scales = "free")

## En recodant les labels

x <- make.unique(as.character(ddf$label))
ddf$x <- factor(x, levels = x[order(ddf$value)])

labels <- with(ddf, structure(as.character(label), .Names = as.character(x)))

ggplot(ddf) +
  geom_bar(aes(x = x, y = value), stat = "identity",
           width = 0.5, fill = "#1f78b4") +
  facet_wrap(~type, nrow = 2, scales = "free") +
  scale_x_discrete(labels = labels)


Retourner vers « Questions en cours »

Qui est en ligne

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