2017-06-07 2 views
2

Je voudrais commander mon graphique facet_plot sur deux paramètres en même temps. J'ai jeté un oeil here et here mais je ne comprends pas comment faire face à mes deux axes use et es.type en même temps.commander une grille facet_grid ou facet_wrap par modalité dans ggplot2

library(ggplot2) 

my.df <- data.frame(site = sample(c("place1","place2"), 20, replace = T), value = sample(1:10,20,replace = T), 
        use = sample(c("medic","pharma","foodS","forage"), 5, replace = T), es.type = sample(c("plante","cereal","sol","sun"), 5, replace = T)) 

si my.df peut ressembler à:

 site value use es.type 
1 place2  5 medic  sol 
2 place2  2 forage  sun 
3 place2  2 medic plante 
4 place2  8 pharma plante 
5 place2  8 foodS cereal 
6 place1  9 medic  sol 
7 place1  6 forage  sun 
8 place2 10 medic plante 
9 place1  8 pharma plante 
10 place1 10 foodS cereal 
11 place1  7 medic  sol 
12 place1  3 forage  sun 
13 place1  5 medic plante 
14 place2  7 pharma plante 
15 place1  2 foodS cereal 
16 place1  9 medic  sol 
17 place2  1 forage  sun 
18 place1  2 medic plante 
19 place1  8 pharma plante 
20 place2  8 foodS cereal  

ma parcelle est

ggplot(data = my.df)+ 
    geom_bar(aes(x = site, y = value, fill = site), stat="identity")+ 
    facet_wrap(use~es.type)+ 
    theme(axis.text.x=element_blank(), 
     axis.ticks.x=element_blank()) 

enter image description here

Je voudrais modifier l'ordre facet et ont la combinaison max premier.

+0

"combinaison max" est ambiguë. Voulez-vous dire la combinaison de 'use' et' es.type'? Un des sites ou les deux? Peut-être dites-nous dans quel ordre les facettes devraient être. – Axeman

+0

Désolé pour cette ambiguïté. Je veux jouer sur 'use' et' es.type' et avoir le maximum sur les deux valeurs en première position. – delaye

Répondre

2

Vous pouvez essayer d'utiliser une interaction, par exemple en collant les deux variables ensemble.

library(tidyverse) 
# Calculate the maximum on both values 
gr <- my.df %>% 
    mutate(group=paste(use, es.type, sep="\n")) %>% 
    group_by(group) %>% 
    summarise(Max=sum(value)) %>% 
    arrange(-Max) 

# Plot the data, but specifiying the order of the facets via 
# the factor levels with respect to the order in `gr`. 
my.df %>% 
    mutate(group=factor(paste(use, es.type, sep="\n"), levels=gr$group)) %>% 
    ggplot()+ 
    geom_bar(aes(x = site, y = value, fill = site), stat="identity")+ 
    facet_wrap(~group)+ 
    theme(axis.text.x=element_blank(), 
     axis.ticks.x=element_blank()) 

enter image description here

- Dans la base R

vous pouvez le faire avant le traçage:

my.df$group <- paste(my.df$use, my.df$es.type, sep="\n") 
gr <- aggregate(value ~ group, my.df, sum) 
gr <- gr[order(gr$value, decreasing = T), ] 
my.df$group <- factor(my.df$group, levels = gr$group) 
+0

Je suis d'accord, c'est probablement la meilleure façon d'aborder cela. Cependant, les noms de facettes ne semblent pas s'aligner, par ex. où est 'pharma',' plante'? – Axeman

+0

@Axeman Ça devrait marcher. L'exemple de données fourni 'my.df' est différent des données collées dans la question. – Jimbou

+0

Oh maintenant je vois. C'est confus! – Axeman