2014-04-27 5 views
4

J'essaie d'ajouter des étiquettes avec l'âge moyen des mâles et des femelles sur ce boxplot pour 2 groupes. Jusqu'à présent, je n'ai pu le faire que par groupe, mais pas par sexe et groupe.Ajouter plusieurs étiquettes sur le boxplot ggplot2

Mon trame de données:

Age=c(60, 62, 22, 24, 21, 23) 
Sex=c("f", "m", "f","f","f","m") 
Group=c("Old", "Old", "Young", "Young", "Young", "Young") 

aging<-data.frame(Age, Sex, Group) 

Et la commande de la parcelle:

ggplot(data=aging, aes(x=Group, y=Age))+geom_boxplot(aes(fill=Sex)) 
+geom_text(data =aggregate(Age~Group,aging, mean), 
aes(label =round(Age,1), y = Age + 3), size=6) 

Graph with 2 groups and 2 genders per group

+0

Pourriez-vous fournir des données minimales afin que nous puissions tester le code directement? – ilir

+0

@ilir J'ai ajouté quelques données sur la version éditée du message – Alba

+0

@Alba [this] (http://stackoverflow.com/a/13370258/640783) peut aider. –

Répondre

8

Vous devriez probablement enregistrer les données agrégées sur un objet distinct pour la clarté et l'utilisation position=position_dodge() dans les geom_text() Options:

aging.sum = aggregate(Age ~ Group + Sex, aging, mean) 

ggplot(data=aging, aes(x=Group, y=Age, fill=Sex)) + 
    geom_boxplot(position=position_dodge(width=0.8)) + 
    geom_text(data=aging.sum, aes(label=round(Age,1), y = Age + 3), 
      size=6, position=position_dodge(width=0.8)) 

Jouer avec le width jusqu'à ce que vous êtes satisfait de la résultats. Notez que je mets fill=Sex dans la définition globale aes de sorte qu'il s'applique également aux étiquettes de texte.

Édition: Sur la suggestion @ user20650 ajoutée position_dodge() à geom_boxplot() pour un alignement correct.

+0

Oui, merci beaucoup pour l'aide qui est ce que je cherchais – Alba

+0

@ user20650 Merci, ajouté à la réponse. – ilir

+0

@ilir; Bon produit – user20650

6

Si vous manquez l'âge moyen pour le sexe et le groupe alors genre doivent être dans l'état global.

Exemple - est-ce ce que vous voulez?

p <- ggplot(data=mtcars, aes(x=factor(vs), y=mpg, fill=factor(am))) + 
          geom_boxplot(position = position_dodge(width=0.9)) 

a <- aggregate(mpg ~ vs + am , mtcars, function(i) round(mean(i))) 

p + geom_text(data = a, aes(label = mpg), 
            position = position_dodge(width=0.9)) 

+1

@Alba; vous pouvez utiliser l'argument 'vjust' dans l'appel' geom_text' pour modifier la position y du texte. ajoutez 'vjust = 1'. – user20650

+0

Merci, Ilir ci-dessus et vous m'a donné la réponse que je cherchais – Alba

Questions connexes