J'ai utilisé la ggplot
commande suivante :
ggplot(survey, aes(x = age)) + stat_bin(aes(n = nrow(h3), y = ..count.. / n), binwidth = 10)
+ scale_y_continuous(formatter = "percent", breaks = c(0, 0.1, 0.2))
+ facet_grid(hospital ~ .)
+ theme(panel.background = theme_blank())
produire
J'aimerais changer les étiquettes de facette , cependant, en quelque chose de plus court (comme Hosp 1
, Hosp 2
...) car elles sont trop longues maintenant et semblent étroites (augmenter la hauteur du graphique n'est pas une option, cela prendrait trop de place dans le document). J'ai regardé la page d'aide de facet_grid mais je ne sais pas comment.
ggplot(transform(iris, Species = c("S", "Ve", "Vi")[as.numeric(Species)]), aes(Petal.Length)) + stat_bin() + facet_grid(Species ~ .)
levels(x$measurements) <- c(bquote(Area ~~ (cm^2)), bquote(Length ~~ (cm)))
) elle n'apparaîtra pas dans l'expression mathématique. Comment afficher des expressions sous forme d'étiquettes de facettes?labeller
option pourfacet_grid
: stackoverflow.com/questions/37089052/…Voici une solution qui évite de modifier vos données:
Supposons que votre tracé soit facetté par la
group
partie de votre trame de données, qui a des niveauxcontrol, test1, test2
, puis créez une liste nommée par ces valeurs:Créez ensuite une fonction 'étiqueteuse' et poussez-la dans votre appel facet_grid:
Celui-ci utilise les niveaux de la trame de données pour indexer la liste hospital_names, renvoyant les valeurs de la liste (les noms corrects).
Veuillez noter que cela ne fonctionne que si vous n'avez qu'une seule variable de facettage. Si vous avez deux facettes, votre fonction d'étiqueteuse doit renvoyer un vecteur de nom différent pour chaque facette. Vous pouvez le faire avec quelque chose comme:
Où
facet1_names
etfacet2_names
sont des listes prédéfinies de noms indexés par les noms d'index de facette ('Hostpital # 1', etc.).Modifier: la méthode ci-dessus échoue si vous transmettez une combinaison variable / valeur que l'étiqueteuse ne connaît pas. Vous pouvez ajouter une sécurité intégrée pour les variables inconnues comme celle-ci:
Réponse adaptée de la façon de changer les étiquettes strip.text dans ggplot avec facette et marge = VRAI
edit: AVERTISSEMENT : si vous utilisez cette méthode pour créer une facette par une colonne de caractères , vous pouvez obtenir des étiquettes incorrectes. Voir ce rapport de bogue .corrigé dans les versions récentes de ggplot2.la source
Voici une autre solution qui est dans l'esprit de celle donnée par @ naught101, mais plus simple et ne lance pas non plus d'avertissement sur la dernière version de ggplot2.
Fondamentalement, vous créez d'abord un vecteur de caractères nommé
Et puis vous l'utilisez comme étiqueteuse, simplement en modifiant la dernière ligne du code donné par @ naught101 en
J'espère que cela t'aides.
la source
as_labeller
? J'ai trouvé du code source sur le référentiel CRAN GitHub , mais après la mise à niveau vers la dernière version (sur CRAN!), Je ne semble pas avoir la fonction.hospital ~ gender
ou quelque chose? Existe-t-il un moyen d'utiliser des étiqueteuses sur les deux axes? Je ne vois rien d'évident dans les documents.Voici comment je l'ai fait avec
facet_grid(yfacet~xfacet)
ggplot2, version 2.2.1:Notez que cela ne contient pas d'appel à
as_labeller()
- quelque chose avec lequel j'ai lutté pendant un certain temps.Cette approche est inspirée du dernier exemple de la page d'aide Fonction Coerce to Labeller .
la source
setNames()
stackoverflow.com/a/22428439/3362993Si vous avez deux facettes
hospital
etroom
que vous souhaitez renommer une seule, vous pouvez utiliser:Pour renommer deux facettes à l'aide de l'approche vectorielle (comme dans la réponse de naught101), vous pouvez faire:
la source
Le moyen LE PLUS FACILE de changer SANS modifier les données sous-jacentes est:
1) Créez un objet en utilisant la
as_labeller
fonction en ajoutant la coche arrière pour chacune des valeurs par défaut :2) Nous ajoutons dans le GGplot:
la source
Notez que cette solution ne fonctionnera pas bien dans le cas où ggplot affichera moins de facteurs que votre variable ne contient réellement (ce qui pourrait arriver si vous aviez par exemple été un sous-ensemble):
Une solution simple (en plus d'ajouter tous les facteurs inutilisés dans names_li, ce qui peut être fastidieux) consiste à supprimer les facteurs inutilisés avec droplevels (), soit dans l'ensemble de données d'origine, soit dans la fonction labbeler, voir:
la source
Cette solution est très proche de celle de @domi, mais est conçue pour raccourcir le nom en récupérant les 4 premières lettres et le dernier numéro.
la source
Les deux
facet_wrap
etfacet_grid
acceptent également l'entrée deifelse
comme argument. Donc, si la variable utilisée pour le facettage est logique, la solution est très simple:Si la variable a plus de catégories, l'
ifelse
instruction doit être imbriquée .Comme effet secondaire, cela permet également de créer des groupes à facettes dans l'
ggplot
appel.la source
Ajout d'une autre solution similaire à @ domi avec analyse des symboles mathématiques, exposant, indice, parenthèse / parenthèse, .etc.
Créé le 2019-03-30 par le package reprex (v0.2.1.9000)
la source
Je pense que toutes les autres solutions sont vraiment utiles pour ce faire, mais il existe encore un autre moyen.
Je suppose:
dplyr
package, qui a lamutate
commande pratique , etvotre jeu de données est nommé
survey
.enquête%>% mutent (Hosp1 = Hospital1, Hosp2 = Hospital2, ........)
Cette commande vous aide à renommer les colonnes, mais toutes les autres colonnes sont conservées.
Faites de même
facet_wrap
, vous allez bien maintenant.la source
La définition de la fonction d'étiqueteuse avec
variable, value
comme arguments ne fonctionnerait pas pour moi. De plus, si vous souhaitez utiliser une expression, vous devez utiliser lapply et ne pouvez pas simplement utiliserarr[val]
, car l'argument de la fonction est un data.frame.Ce code a fonctionné:
la source
Depuis que je ne suis pas encore autorisé à commenter les messages, je poste ce séparément comme additif à la réponse de Vince et la réponse de son520804 . Le crédit leur revient.
En utilisant l'exemple de l'iris de Vince et le code partiel de son520804, je l'ai fait avec la fonction mutate et j'ai trouvé une solution facile sans toucher au jeu de données d'origine. L'astuce consiste à créer un vecteur de nom stand-in et à utiliser mutate () à l'intérieur du canal pour corriger temporairement les noms de facettes:
Dans cet exemple, vous pouvez voir que les niveaux de i $ Species sont temporairement modifiés en noms communs correspondants contenus dans le vecteur new_names. La ligne contenant
peut facilement être retiré pour révéler le nom d'origine.
Avertissement: cela peut facilement introduire des erreurs dans les noms si le vecteur nouveau_nom n'est pas correctement configuré. Il serait probablement beaucoup plus propre d'utiliser une fonction distincte pour remplacer les chaînes variables. Gardez à l'esprit que le vecteur new_name peut devoir être répété de différentes manières pour correspondre à l'ordre de votre jeu de données d'origine. Veuillez vérifier deux fois et trois fois que ceci est correctement réalisé.
la source
new_names <- c('setosa' = 'Bristle-pointed iris', 'versicolor' = 'Poison flag iris', 'virginica' = 'Virginia iris')
puis dans le mutate, vous pouvez créer une nouvelle colonne ainsi:mutate(Spec = new_names[Species])
Cela fonctionne pour moi.
Définissez un facteur:
et utiliser, dans
ggplot()
:la source
Prolonger la réponse de naught101 - le mérite lui revient
Ce que vous devez faire est de créer une liste avec un mappage de nom à nom
et redéfinir
plot_labeller()
avec de nouveaux arguments par défaut:Puis:
Vous pouvez également créer une fonction dédiée pour chacune des modifications d'étiquette que vous souhaitez avoir.
la source
J'ai une autre façon d'atteindre le même objectif sans modifier les données sous-jacentes:
Ce que j'ai fait ci-dessus, c'est de changer les étiquettes du facteur dans le bloc de données d'origine, et c'est la seule différence par rapport à votre code d'origine.
la source
Avez-vous essayé de changer les niveaux spécifiques de votre
Hospital
vecteur?la source
Je pense que je devrais ajouter ma réponse à cela, car il m'a fallu assez de temps pour que cela fonctionne:
Cette réponse est pour vous si:
bquote
) dans vos étiquettes etJ'ai essentiellement mis les étiquettes dans un vecteur nommé afin que les étiquettes ne soient pas confondues ou échangées. L'
labeller
expression pourrait probablement être plus simple, mais cela fonctionne au moins (les améliorations sont les bienvenues). Notez le `(guillemets arrière) pour protéger le facteur de facette.la source
Solution simple (d' ici ):
la source
Après avoir lutté pendant un certain temps, ce que j'ai trouvé, c'est que nous pouvons utiliser
fct_relevel()
et àfct_recode()
partirforcats
de conjointement pour changer l'ordre des facettes ainsi que fixer les étiquettes des facettes. Je ne sais pas si c'est supporté par la conception, mais ça marche! Découvrez les parcelles ci-dessous:Créé le 2020-02-16 par le package reprex (v0.3.0)
la source