Les données:
type size amount
T 50% 48.4
F 50% 48.1
P 50% 46.8
T 100% 25.9
F 100% 26.0
P 100% 24.9
T 150% 21.1
F 150% 21.4
P 150% 20.1
T 200% 20.8
F 200% 21.5
P 200% 16.5
J'ai besoin de tracer un graphique à barres des données ci-dessus à l'aide de ggplot (axe des x -> "type", axe des y -> "montant", groupe par "taille"). Lorsque j'ai utilisé le code suivant, je n'obtiens pas la variable "type" ni la "taille" dans l'ordre indiqué dans les données. S'il vous plaît voir la figure. J'ai utilisé le code suivant pour cela.
ggplot(temp, aes(type, amount , fill=type, group=type, shape=type, facets=size)) +
geom_bar(width=0.5, position = position_dodge(width=0.6)) +
facet_grid(.~size) +
theme_bw() +
scale_fill_manual(values = c("darkblue","steelblue1","steelblue4"),
labels = c("T", "F", "P"))
.
Pour résoudre le problème d'ordre, j'ai utilisé une méthode factorielle pour la variable "type" en utilisant ce qui suit. S'il vous plaît voir la figure aussi.
temp$new = factor(temp$type, levels=c("T","F","P"), labels=c("T","F","P"))
Cependant, je ne sais pas comment régler l’ordre de la variable "taille". Ce devrait être 50%, 100%. 150% et 200%.
Faites de votre taille un facteur dans votre dataframe en:
temp$size_f = factor(temp$size, levels=c('50%','100%','150%','200%'))
Puis changez le facet_grid(.~size)
en facet_grid(.~size_f)
Puis intrigue:
Les graphiques sont maintenant dans le bon ordre.
Voici une solution qui garde les choses dans une chaîne de tuyaux Dplyr. Vous triez les données à l'avance, puis utilisez mutate_at pour convertir en facteur. J'ai légèrement modifié les données pour montrer comment cette solution peut être appliquée de manière générale, à partir de données pouvant être triées de manière judicieuse:
# the data
temp <- data.frame(type=rep(c("T", "F", "P"), 4),
size=rep(c("50%", "100%", "200%", "150%"), each=3), # cannot sort this
size_num = rep(c(.5, 1, 2, 1.5), each=3), # can sort this
amount=c(48.4, 48.1, 46.8,
25.9, 26.0, 24.9,
20.8, 21.5, 16.5,
21.1, 21.4, 20.1))
temp %>%
arrange(size_num) %>% # sort
mutate_at(vars(size), funs(factor(., levels=unique(.)))) %>% # convert to factor
ggplot() +
geom_bar(aes(x = type, y=amount, fill=type),
position="dodge", stat="identity") +
facet_grid(~ size)
Vous pouvez également appliquer cette solution pour organiser les barres dans les facettes, même si vous ne pouvez choisir qu'un seul ordre préféré:
temp %>%
arrange(size_num) %>%
mutate_at(vars(size), funs(factor(., levels=unique(.)))) %>%
arrange(desc(amount)) %>%
mutate_at(vars(type), funs(factor(., levels=unique(.)))) %>%
ggplot() +
geom_bar(aes(x = type, y=amount, fill=type),
position="dodge", stat="identity") +
facet_grid(~ size)
ggplot() +
geom_bar(aes(x = type, y=amount, fill=type),
position="dodge", stat="identity") +
facet_grid(~ size)