128 votes

Positionner geom_text sur le diagramme à barres esquivé

J'ai essayé de rendre le titre explicite, mais voici ce qu'il en est - 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 diagramme à barres esquivé, faire l'opération suivante coord_flip et placer 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 le résultat ici .

enter image description here

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

211voto

kohske Points 30437

Est-ce que c'est ce que vous voulez ?

library(ggplot2)

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

Il s'agit de position = position_dodge(width = .9) (où .9 est la largeur par défaut des barres) au lieu de position = "dodge" qui n'est qu'un raccourci sans aucun paramètre. En outre, vous devez définir le paramètre group=ustanova esthétique en geom_text d'esquiver les étiquettes en ustanova (Une deuxième option consisterait à faire de la fill = ustanova une esthétique globale via ggplot(bar, aes(fill = ustanova))


En ggplot2_2.0.0 vous trouverez plusieurs exemples dans ?geom_text sur la manière de positionner geom_text sur des barres esquivées ou empilées (le morceau de code appelé " # Aligning labels and bars" ). Les questions-réponses Quel est l'argument de la largeur dans position_dodge ? fournit une description plus complète du sujet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X