2009-09-27 6 views
6

Supposons que vous avez l'ensemble de données suivantes:Ajout des statistiques sommaires (ou même des points de données brutes) à boxplots position esquivé

trt <- ifelse(runif(100)<0.5,"drug","placebo") 
inj.site <- ifelse(runif(100)<0.5,"ankle","wrist") 
relief <- 20 + 0.5*(inj.site=="ankle") + 0.5*(trt=="drug") + rnorm(100) 
to.analyze <- data.frame(trt,inj.site,relief) 

Maintenant, l'idée est de faire un boxplot avec le site de blessure sur l'axe des x et des boîtes par traitement côte à côte:

bplot <- ggplot(to.analyze,aes(inj.site,relief,fill=trt)) + geom_boxplot(position="dodge") 

Assez facile. Mais maintenant je veux ajouter des points de données brutes au-dessus des boîtes. Si je n'ai des boîtes avec position="dodge", ce serait facile:

bplot + geom_point(aes(colour=trt)) 

Cependant, cela attire des points entre les boîtes, et en ajoutant un position="dodge" à cette géométrie ne semble pas fonctionner. Comment puis-je ajuster cela pour que les points soient dessinés au-dessus des boîtes? Bonus: même situation en utilisant stat_summary(blah,y.fun=mean,shape="+") pour surdéplacer les moyennes, ce qui pose le même problème.

+0

relief <- 20 + 0,5 * (inj.site == cheville) + 0,5 * (trt == "médicament") + rnorm (100) devrait être: relief <- 20 + 0,5 * (inj.site == "cheville") + 0,5 * (trt == "drogue") + rnorm (100) – Paolo

+0

er, oui, corrigé. –

Répondre

3

Hadley sans doute me corriger si je me trompe ...

est ici la syntaxe naturelle:

bplot + geom_point(aes(colour=trt), position=position_dodge(width=.5)) 

(position = "esquive" va faire la même chose, sans le paramètre. Quand je le trace, j'obtiens quelque chose qui ressemble à un position_jitter(), ce qui est probablement ce que vous obtenez aussi. Curieux, je suis allé voir dans la source, où j'ai trouvé la fonction pos_dodge(). (Type pos_dodge à une invite de R pour le voir ...) est ici la fin de celui-ci:

within(df, { 
    xmin <- xmin + width/n * (seq_len(n) - 1) - diff * (n - 1)/(2 * n) 
    xmax <- xmin + d_width/n 
    x <- (xmin + xmax)/2 
}) 

n est le nombre de lignes de la trame de données. Donc on dirait qu'il esquive les points individuels par une fraction indexée par la ligne! Donc le premier point est dodé largeur/n, le second est évidé 2 * largeur/n, et le dernier est évidé n * largeur/n.

Ce n'est évidemment pas ce que vous signifiait, même si c'est ce que vous a dit. Vous pouvez être coincé recréer le boxplot esquivé manuellement, ou en utilisant une visualisation différente, comme facettage peut-être?

ggplot(to.analyze,aes(inj.site,relief)) + geom_boxplot() + facet_wrap(~ trt) 
+0

En facettage, cela fonctionne parfaitement. Cependant, pour des raisons de visualisation, j'aurais préféré éviter la position, bien que j'aie pu essayer d'injecter sur inj.site? –

Questions connexes