2015-07-15 1 views
3

je les données suivantes:Modifier l'ordre d'empilement dans la zone empilée ggplot graphique

df <- as.data.frame(c(rep(1,3),rep(2,3),rep(3,3))) 
names(df) <- "cont_var" 
df$factor_var <- as.factor(rep(c("fac1","fac2","fac3"),3)) 
df$prop <- c(10,20,70,20,30,50,25,40,35) 

Les niveaux de « factor_var » être:

> levels(df$factor_var) 
[1] "fac1" "fac2" "fac3" 

Je fais une parcelle de zone empilés en utilisant les éléments suivants:

library(ggplot) 
ggplot(df, aes(x=cont_var, y=prop, fill=factor_var)) + 
    geom_area(colour="black",size=.2, alpha=.8) + 
    scale_fill_manual(values=c("blue", "grey", "red")) 

qui renvoie le résultat suivant: enter image description here

La légende montre "factor_var" ordonné selon les niveaux vus auparavant mais les zones ne sont pas empilées dans le même ordre. Comment puis-je produire une sortie avec du rouge en bas puis du gris puis du bleu empilé en haut comme c'est le cas dans la légende?

(. NB Ceci est l'ordre que j'ai besoin (factor_var étant une variable ordonnée), il est non seulement un cas d'alignement l'empilement à l'ordre de légende pour des raisons esthétiques.)

EDIT: Résultat souhaité indiqué ci-dessous

enter image description here

SOLUTION !!

réordonner les dataframe est nécessaire de créer le résultat souhaité:

newdata <- df[order(df$cont_var, df$factor_var),] 

Un grand merci pour votre aide.

Répondre

5

Vous pouvez changer l'ordre de votre légende en ajoutant guides(fill = guide_legend(reverse=TRUE)) à votre code:

ggplot(dat, aes(x=cont_var, y=prop, fill=factor_var)) + 
    geom_area(colour="black",size=.2, alpha=.8) + 
    scale_fill_manual(values=c("blue", "grey", "red")) + 
    guides(fill = guide_legend(reverse=TRUE)) 

cela donne:

enter image description here


Vous pouvez définir les niveaux de facteur avant de tracer:

# manually ordering the factor levels 
dat$factor_var2 <- factor(dat$factor_var, levels=c("fac3","fac2","fac1")) 
# automatcally ordering the factor levels (copied from Jakub P's answer) 
dat$factor_var2 <- factor(dat$factor_var, sort(unique(dat$factor_var), decreasing = TRUE)) 

ggplot(dat, aes(x=cont_var, y=prop, fill=factor_var2)) + 
    geom_area(colour="black",size=.2, alpha=.8) + 
    scale_fill_manual(values=c("blue", "grey", "red")) 

cela donne:

enter image description here

+0

Cela fonctionne pour l'exemple ci-dessus. Cependant mes données réelles sont un peu plus compliquées - il y a 9 niveaux qui sont dans le bon ordre dans la légende mais qui sont en fait tracés dans l'ordre (de bas en haut): niveau 5, 4, 3, 2, 1, 6 , 7, 8, 9. Je suis désolé je ne peux pas le reproduire exactement ici, mes données sont sensibles. – user2568648

+0

@ user2568648 voir la mise à jour – Jaap

+0

Avec la mise à jour et 'levels (dat $ factor_var)', les niveaux sont dans l'ordre que je voudrais pour l'empilement, mais le niveau 5 est toujours tracé en bas! – user2568648

1

Est-ce que ce travail?

df$factor_var <- rep(c("fac1","fac2","fac3"),3) 
df$factor_var <- factor(df$factor_var, sort(unique(df$factor_var), decreasing = T)) 

Sur les données de test que vous avez proposé ce produit résultat cohérent de FAC1 étant rouge et au fond, etc.

+0

Comme pour la proposition de Jaaps, cela réordonne les facteurs comme je voudrais les tracer, confirmés par 'levels (df $ factor_var)', mais le niveau 5 est toujours tracé en bas! – user2568648

+0

Dans l'exemple donné, en fait les valeurs de fac3 doivent être en bas et fac1 en haut, ce ne sont pas les ordres de couleurs qui doivent changer mais l'ordre des valeurs - voir 2nd plot ajouté (fait en manipulant les valeurs). – user2568648

+0

OK, je vous ai mal compris. Votre solution (commander le data.frame) me fait penser à une conclusion générale à laquelle je suis parvenu il y a quelques mois: il fallait trier les facteurs, les étiquettes et les données (les trois) pour obtenir le résultat souhaité. Manquer un d'entre eux conduisait presque toujours à quelque chose de désordonné dans le tableau. –