Salut, j'utilise généralement du code comme le suivant pour réorganiser les barres dans ggplot ou d'autres types de tracés.
tracé normal (non ordonné)
library(tidyverse)
iris.tr <-iris %>% group_by(Species) %>% mutate(mSW = mean(Sepal.Width)) %>%
select(mSW,Species) %>%
distinct()
ggplot(iris.tr,aes(x = Species,y = mSW, color = Species)) +
geom_point(stat = "identity")
Ordre du facteur + tracé ordonné
iris.tr$Species <- factor(iris.tr$Species,
levels = iris.tr[order(iris.tr$mSW),]$Species,
ordered = TRUE)
ggplot(iris.tr,aes(x = Species,y = mSW, color = Species)) +
geom_point(stat = "identity")
La ligne de facteur est extrêmement désagréable pour moi et je me demande pourquoi arrange()
ou une autre fonction ne peut pas simplifier cela. Il me manque quelque chose?
Remarque:
Cela ne fonctionne pas, mais j'aimerais savoir si quelque chose comme ça existe dans le tidyverse.
iris.tr <-iris %>% group_by(Species) %>% mutate(mSW = mean(Sepal.Width)) %>%
select(mSW,Species) %>%
distinct() %>%
arrange(mSW)
ggplot(iris.tr,aes(x = Species,y = mSW, color = Species)) +
geom_point(stat = "identity")
En utilisant ‹ forcats ›:
iris.tr %>%
mutate(Species = fct_reorder(Species, mSW)) %>%
ggplot() +
aes(Species, mSW, color = Species) +
geom_point()
Réorganiser le facteur en utilisant la base:
iris.ba = iris
iris.ba$Species = with(iris.ba, reorder(Species, Sepal.Width, mean))
Traduction en dplyr
:
iris.tr = iris %>% mutate(Species = reorder(Species, Sepal.Width, mean))
Après cela, vous pouvez continuer à résumer et à tracer comme dans votre question.
Quelques commentaires: réorganiser un facteur modifie une colonne de données. La commande dplyr
pour modifier une colonne de données est mutate
. Tout ce que arrange
fait est de réordonner les lignes, cela n'a aucun effet sur les niveaux du facteur et donc aucun effet sur l'ordre d'une légende ou d'un axe dans ggplot.
Tous les facteurs ont un ordre pour leurs niveaux. La différence entre un ordered = TRUE
facteur et un facteur régulier est la façon dont les contrastes sont configurés dans un modèle. ordered = TRUE
ne doit être utilisé que si vos niveaux de facteurs ont un ordre de classement significatif, comme "Faible", "Moyen", "Élevé", et même alors, cela n'a d'importance que si vous construisez un modèle et ne voulez pas les contrastes par défaut en comparant tout à un niveau de référence.
S'il vous arrive d'avoir un vecteur de caractères à commander, par exemple:
iris2 <- iris %>%
mutate(Species = as.character(Species)) %>%
group_by(Species) %>%
mutate(mSW = mean(Sepal.Width)) %>%
ungroup()
Vous pouvez également ordonner le niveau de facteur en utilisant le comportement de la fonction forcats :: as_factor :
"Par rapport à la base R, cette fonction crée des niveaux dans l'ordre dans lequel ils apparaissent"
library(forcats)
iris2 %>%
arrange(mSW) %>%
mutate(Species = as_factor(Species)) %>%
ggplot() +
aes(Species, mSW, color = Species) +
geom_point()