Posicione geom_text no gráfico de barras evitado

96

Tentei tornar o título autoexplicativo, mas aqui vai - primeiro os dados:

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

E eu gostaria de criar um barplot evitado, fazer o coord_flipe colocar alguns rótulos de texto dentro das 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()

você pode ver a saída aqui .

insira a descrição da imagem aqui

Acho que estou pedindo algo trivial. Quero que os rótulos de texto "sigam" as barras empilhadas. Os rótulos são colocados corretamente no eixo y, mas como posicioná-los corretamente no eixo x?

aL3xa
fonte
Sim ... Eu deveria ter postado este na lista de e-mail ggplot2. Não quero fazer postagens cruzadas, então vou colocar meu chapéu da paciência e esperar que @hadley apareça com alguma coisa! =)
aL3xa
Eu estava errado. E eu preciso me familiarizar mais com o pacote ggplot, aparentemente.
Joris Meys

Respostas:

152

É isso que voce quer?

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

A tecla está usando em position = position_dodge(width = 1)vez de position = "dodge", que é apenas um atalho sem qualquer parâmetro.

insira a descrição da imagem aqui


Em ggplot2_2.0.0você encontrará vários exemplos ?geom_textde como posicionar geom_textem barras desviadas ou empilhadas (o trecho de código denominado " # Aligning labels and bars"). O P&R Qual é o argumento de largura em position_dodge? Fornece uma descrição mais completa do tópico.

kohske
fonte
1
Exatamente o que eu quero! Eu te devo uma cerveja por essa! =)
aL3xa
2
Então, não há como automatizar isso? Deve-se sempre especificar a largura?
vashts85
12
Isso só funcionou para mim depois de adicionar fill = ustanovaa geom_textcamada, o que faz sentido, especialmente quando você tem muitas barras horizontais (talvez necessárias apenas para 3+ barras por x) e o número de quebras deve ser o mesmo para o texto e para as barras .
Alan
3
Para facetado e evitado, esta é uma resposta útil: stackoverflow.com/a/26661791/1000343
Tyler Rinker
@Alan entre todas as pesquisas que fiz no stackoverflow, sua resposta foi a única que resolveu meu problema.
Ga13