web-dev-qa-db-fra.com

ggplot: organiser des boîtes à moustaches de plusieurs variables y pour chaque groupe d'un x continu

Je voudrais créer des boîtes à moustaches de plusieurs variables pour des groupes d'une variable x continue. Les boîtes à moustaches doivent être disposées côte à côte pour chaque groupe de x.

Les données ressemblent à ceci:

require (ggplot2)
require (plyr)
library(reshape2)

set.seed(1234)
x   <- rnorm(100)
y.1 <- rnorm(100)
y.2 <- rnorm(100)
y.3 <- rnorm(100)
y.4 <- rnorm(100)

df <- as.data.frame(cbind(x,y.1,y.2,y.3,y.4))

que j'ai ensuite fondu

dfmelt <- melt(df, measure.vars=2:5)    

Le facet_wrap comme indiqué dans cette solution ( Plusieurs tracés par facteur dans ggplot (facettes) ) me donne chaque variable dans un tracé individuel, mais je voudrais avoir les boxplots de chaque variable côte à côte pour chaque bac de x dans un diagramme.

ggplot(dfmelt, aes(value, x, group = round_any(x, 0.5), fill=variable))+
geom_boxplot() + 
geom_jitter() + 
facet_wrap(~variable)

fig1

Cela montre les variables y côte à côte mais ne classe pas x.

ggplot(dfmelt) +
geom_boxplot(aes(x=x,y=value,fill=variable))+
facet_grid(~variable)

fig2

Maintenant, je voudrais produire un tel tracé pour chaque groupe de x.

Que faut-il changer ou ajouter?

15
sina

Vous ne savez pas exactement ce que vous recherchez. Est-ce proche?

enter image description here

library(ggplot2)
library(plyr)
ggplot(dfmelt, aes(x=factor(round_any(x,0.5)), y=value,fill=variable))+
  geom_boxplot()+
  facet_grid(.~variable)+
  labs(x="X (binned)")+
  theme(axis.text.x=element_text(angle=-90, vjust=0.4,hjust=1))

MODIFIER (réponse au commentaire de l'OP)

Vous pouvez mettre les Y les uns à côté des autres dans chaque bac en supprimant simplement l'appel facet_grid(...), mais je ne le recommande pas.

ggplot(dfmelt, aes(x=factor(round_any(x,0.5)), y=value, fill=variable))+
  geom_boxplot()+
  labs(x="X (binned)")+
  theme(axis.text.x=element_text(angle=-90, vjust=0.4,hjust=1))

Si vous devez le faire de cette façon, c'est encore plus clair en utilisant des facettes:

dfmelt$bin <- factor(round_any(dfmelt$x,0.5))
ggplot(dfmelt, aes(x=bin, y=value, fill=variable))+
  geom_boxplot()+
  facet_grid(.~bin, scales="free")+
  labs(x="X (binned)")+
  theme(axis.text.x=element_blank())

Notez l'ajout d'une colonne bin à dfmelt. En effet, l'utilisation de factor(round_any(x,0.5)) dans la formule facet_grid(...) ne fonctionne pas.

30
jlhoward