Positionnez geom_text sur un barplot esquivé

96

J'ai essayé de rendre le titre explicite, mais voici les données d'abord:

dtf <- structure(list(variable = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 
4L, 4L, 5L, 5L), .Label = c("vma", "vla", "ia", "fma", "fla"), class = "factor"), 
    ustanova = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L), .Label = c("srednja škola", "fakultet"), class = "factor"), 
    `(all)` = c(42.9542857142857, 38.7803203661327, 37.8996138996139, 
    33.7672811059908, 29.591439688716, 26.1890660592255, 27.9557692307692, 
    23.9426605504587, 33.2200772200772, 26.9493087557604)), .Names = c("variable", 
"ustanova", "(all)"), row.names = c(NA, 10L), class = c("cast_df", 
"data.frame"), idvars = c("variable", "ustanova"), rdimnames = list(
    structure(list(variable = structure(c(1L, 1L, 2L, 2L, 3L, 
    3L, 4L, 4L, 5L, 5L), .Label = c("vma", "vla", "ia", "fma", 
    "fla"), class = "factor"), ustanova = structure(c(1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("srednja škola", 
    "fakultet"), class = "factor")), .Names = c("variable", "ustanova"
    ), row.names = c("vma_srednja škola", "vma_fakultet", "vla_srednja škola", 
    "vla_fakultet", "ia_srednja škola", "ia_fakultet", "fma_srednja škola", 
    "fma_fakultet", "fla_srednja škola", "fla_fakultet"), class = "data.frame"), 
    structure(list(value = structure(1L, .Label = "(all)", class = "factor")), .Names = "value", row.names = "(all)", class = "data.frame")))

Et j'aimerais créer un barplot esquivé, faire le coord_flipet mettre des étiquettes de texte à l'intérieur des barres:

ggplot(bar) + geom_bar(aes(variable, `(all)`, fill = ustanova), position = "dodge") +
 geom_text(aes(variable, `(all)`, label = sprintf("%2.1f", `(all)`)), position = "dodge") +
 coord_flip()

vous pouvez voir la sortie ici .

entrez la description de l'image ici

Je pense que je demande quelque chose d'insignifiant. Je veux que les étiquettes de texte «suivent» les barres empilées. Les étiquettes sont correctement placées sur l'axe y, mais comment les positionner correctement sur l'axe x?

aL3xa
la source
Yepp ... J'aurais dû publier celui-ci sur la liste de diffusion ggplot2. Je ne veux pas faire de cross-post, alors je vais mettre mon chapeau de patience et attendre que @hadley propose quelque chose! =)
aL3xa
J'avais tort. Et j'ai besoin de me familiariser davantage avec le paquet ggplot apparemment.
Joris Meys

Réponses:

153

c'est ce que tu veux?

ggplot(bar) + 
  geom_bar(aes(variable, `(all)`, fill = ustanova), position = "dodge") +
  geom_text(aes(variable, `(all)`, label = sprintf("%2.1f", `(all)`)), 
            position = position_dodge(width = 1)) + 
  coord_flip()

La clé utilise position = position_dodge(width = 1)au lieu de position = "dodge", qui est juste un raccourci sans aucun paramètre.

entrez la description de l'image ici


Dans ggplot2_2.0.0vous trouverez plusieurs exemples ?geom_textsur la façon de se positionner geom_textsur des barres esquivées ou empilées (le morceau de code nommé " # Aligning labels and bars"). Le Q&A Quel est l'argument width dans position_dodge? Fournit une description plus approfondie du sujet.

kohske
la source
1
Exactement ce que je veux! Je te dois une bière pour celle-ci! =)
aL3xa
2
Alors n'y a-t-il aucun moyen d'automatiser cela? Il faut toujours spécifier la largeur?
vashts85
12
Cela n'a fonctionné pour moi qu'après avoir ajouté fill = ustanovale geom_textcalque, ce qui est logique, surtout lorsque vous avez de nombreuses barres horizontales (peut-être seulement nécessaire pour 3+ barres par x) et que le nombre de sauts doit être le même pour le texte que pour les barres .
Alan
3
Pour les facettes et les esquives, c'est une réponse utile: stackoverflow.com/a/26661791/1000343
Tyler Rinker
@Alan parmi toutes les recherches que j'ai effectuées sur le stackoverflow, votre réponse est la seule qui a résolu mon problème.
Ga13