Posicionar geom_text en el diagrama de barras esquivado

96

Intenté que el título se explicara por sí mismo, pero aquí va: los datos primero:

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")))

Y me gustaría crear una gráfica de barras esquivada, hacer coord_flipy poner algunas etiquetas de texto dentro de las barras:

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()

puedes ver la salida aquí .

ingrese la descripción de la imagen aquí

Creo que estoy pidiendo algo trivial. Quiero que las etiquetas de texto "sigan" las barras apiladas. Las etiquetas se colocan correctamente en el eje y, pero ¿cómo colocarlas correctamente en el eje x?

aL3xa
fuente
Yepp ... Debería haber publicado este en la lista de correo de ggplot2. No quiero hacer publicaciones cruzadas, ¡así que me pondré mi sombrero de paciencia y esperaré a que @hadley se le ocurra algo! =)
aL3xa
Estaba equivocado. Y aparentemente necesito familiarizarme más con el paquete ggplot.
Joris Meys

Respuestas:

154

¿Es esto lo que quieres?

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 clave está usando en position = position_dodge(width = 1)lugar de position = "dodge", que es solo un atajo sin ningún parámetro.

ingrese la descripción de la imagen aquí


En ggplot2_2.0.0encontrará varios ejemplos ?geom_textsobre cómo posicionar geom_texten barras esquivadas o apiladas (el fragmento de código llamado " # Aligning labels and bars"). Las preguntas y respuestas ¿Cuál es el argumento de ancho en position_dodge? Proporciona una descripción más completa del tema.

Kohske
fuente
1
¡Exactamente lo que quiero! ¡Te debo una cerveza por esta! =)
aL3xa
2
Entonces, ¿no hay forma de automatizar esto? ¿Siempre se debe especificar el ancho?
vashts85
12
Esto solo funcionó para mí después de que agregué fill = ustanovala geom_textcapa, lo que tiene sentido, especialmente cuando tiene muchas barras horizontales (tal vez solo sea necesario para más de 3 barras por x) y el número de descansos debe ser el mismo para el texto que para las barras .
Alan
3
Para facetas y esquivadas, esta es una respuesta útil: stackoverflow.com/a/26661791/1000343
Tyler Rinker
@Alan entre todas las búsquedas que hice en stackoverflow, tu respuesta fue la única que resolvió mi problema.
Ga13