2017-09-19 2 views
0

J'ai un ensemble de données qui ressemble à ceci:barplot Stacked pour une conception de 2x2x2 dans ggplot2 en R

conifer.abundance <- c(6,7,8,2,3,4,5,1,7,8,9,8,7,6,5,1) 
lily.abundance <- c(5,5,5,5,4,4,4,4,6,7,8,2,3,4,5,1) 
type <- c("Control","Control","Control","Control","Control","Control","Control","Control","Treatment","Treatment","Treatment","Treatment","Treatment","Treatment","Treatment","Treatment") 
class <- c("City","Rural","City","Rural","City","Rural","City","Rural","City","Rural","City","Rural","City","Rural","City","Rural") 
climate <- c("wet","wet","dry","dry","wet","wet","dry","dry","wet","wet","dry","dry","wet","wet","dry","dry") 
all.abundance <- conifer.abundance + lily.abundance 
dat88 <- data.frame(climate,type,class,conifer.abundance, lily.abundance,all.abundance) 

C'est une conception de 2x2x2. Je veux tracer des graphiques à barres tels que la moyenne de l'abondance est représentée par la somme de l'abondance moyenne des conifères et de l'abondance moyenne des lys (empilés) et elle a sa propre légende. J'ai essayé de suivre le code this, mais il semble qu'il utilise le remplissage pour empiler les barres, mais je dois l'utiliser dans un but différent ici. Supposons, j'ai plusieurs autres points de données, je devrais également tracer un intervalle de confiance bootstrap (comme ci-dessous). Aucune suggestion? Voici mon code actuel pour tracer le graphique ci-dessus.

pd <- position_dodge(0.82) 
    ggplot(dat88, aes(x=class, y=all.abundance, fill = climate)) + 
    theme_bw() + 
    stat_summary(geom="bar", fun.y=mean, position = "dodge") + 
    stat_summary(geom="errorbar", fun.data=mean_cl_boot,position = pd) + 
    ylab("Total Abundance") + 
    facet_grid(~type) 

S'il vous plaît noter que j'ai légèrement changé l'ensemble de données pour représenter un scénario plus biologiquement approprié.

+0

Je ne suis pas sûr que je comprends les exigences mises à jour. Si vous voulez tracer la moyenne bootstrapée par rapport à l'axe des ordonnées, est-il toujours logique d'y tracer l'abondance totale? Ou voulez-vous dire la somme de l'abondance * moyenne * des conifères et de l'abondance * moyenne * du lis? –

+0

Vous avez raison. Une partie de l'abondance moyenne de confiers et de lis, a plus de sens. – Ash

Répondre

2

Si vous voulez empiler les valeurs de hauteur pour le modèle & femelle, vous devez les fusionner/regrouper en une seule variable.

Les deux méthodes suivantes pour manipuler la trame de données sont équivalentes. Cela dépend quels paquets vous êtes plus familier avec:

# data.table package 
dat2 <- data.table::melt(dat, measure.vars = c("male.height", "female.height"), 
         variable.name = "Gender", value.name = "height") 

# tidyr package 
dat3 <- tidyr::gather(dat, key = Gender, value = height, 
         male.height, female.height, factor_key = TRUE) 

> all.equal(dat2, dat3) 
[1] TRUE 

Comme il est un 2 x 2 x 2 conception, j'ai ajouté une dimension à la fois facet_grid pour montrer le type et les espèces. Si ce n'est pas nécessaire, revenir simplement facet_grid(~type):

ggplot(dat2, 
     aes(x = class, y = height, fill = Gender)) + 
    geom_col() + 
    ylab("Total Height") + 
    facet_grid(species~type) + 
    scale_fill_discrete(breaks = c("female.height", "male.height"), 
         labels = c("female", "male")) 

facet plot

+0

Imagine que j'ai plusieurs échantillons comme celui-ci et je veux aussi tracer le bootstrap CI sur la hauteur totale moyenne. Comment puis-je le faire avec ce code? Je sais que, dans cet exemple, il n'est pas logique de prendre la hauteur totale et de prendre une moyenne ... mais j'essaie juste de fournir une extension décente de ce que j'ai. – Ash

+0

Pouvez-vous inclure un échantillon de données plus riche? À l'heure actuelle, il y a exactement un point de données pour chaque combinaison de facteurs, il est donc difficile de comprendre la motivation. –

+0

J'ai mis à jour ma question – Ash