Como colocar rótulos sobre geom_bar para cada barra em R com ggplot2

99

Eu descobri como colocar rótulos em geom_bar em R com ggplot2 , mas ele apenas colocou rótulos (números) em apenas uma barra.

Aqui estão, digamos, duas barras para cada eixo x, como fazer a mesma coisa?

Meus dados e código são assim:

dat <- read.table(text = "sample Types Number
sample1 A   3641
sample2 A   3119
sample1 B   15815
sample2 B   12334
sample1 C   2706
sample2 C   3147", header=TRUE)

library(ggplot2)
bar <- ggplot(data=dat, aes(x=Types, y=Number, fill=sample)) + 
  geom_bar(position = 'dodge') + geom_text(aes(label=Number))

Então, obteremos: insira a descrição da imagem aqui

Parece que os textos numéricos também estão posicionados no padrão "esquiva". Eu pesquisei o manual geom_text para encontrar algumas informações, mas não consigo fazer funcionar.

Sugestões?

Puriney
fonte

Respostas:

142

Experimente isto:

ggplot(data=dat, aes(x=Types, y=Number, fill=sample)) + 
     geom_bar(position = 'dodge', stat='identity') +
     geom_text(aes(label=Number), position=position_dodge(width=0.9), vjust=-0.25)

saída ggplot

rcs
fonte
2
(+1) Você também pode adicionar vjust = -0.5após a position()instrução para que os valores sejam colocados logo acima das barras.
smillig
2
Muito obrigado, a propósito, o código sugere a configuração ymax, portanto aes(x=Types, y=Number, fill=sample, ymax = 16000), produzirá uma área superior mais ampla para o eixo y, de modo que 15815 será melhor mostrado.
Puriney de
Eu recebo este erro: Erro: stat_count () não deve ser usado com nenhuma estética.
userJT
3
esta resposta tem uma sintaxe mais recente stackoverflow.com/questions/33079500/…
userJT
2
@Seymourgeom_text(..., angle=-90)
rcs
4

Para adicionar à resposta do rcs, se você quiser usar position_dodge () com geom_bar () quando x for uma data POSIX.ct, você deve multiplicar a largura por 86400, por exemplo,

ggplot(data=dat, aes(x=Types, y=Number, fill=sample)) + 
 geom_bar(position = "dodge", stat = 'identity') +
 geom_text(aes(label=Number), position=position_dodge(width=0.9*86400), vjust=-0.25)
Matmat
fonte