web-dev-qa-db-fra.com

geom_text comment positionner le texte sur la barre comme je le souhaite?

Je voudrais ajuster le texte sur le barplot.

J'ai essayé d'ajuster hjust/vjust pour afficher comme je l'aime mais il semble que cela ne fonctionne pas correctement.

ggplot(data) + 
        geom_bar(aes(name, count, 
        fill = week), stat='identity', position = 'dodge') +
        geom_text(aes(name,count, 
        label=count),hjust=0.5, vjust=3, size=2,
        position = position_dodge(width = 1)) + 
        coord_flip()

enter image description here

Je voudrais donc que les chiffres soient situés sur chaque barre, au centre, à droite, de manière à ce que ce soit lisible sans se chevaucher comme dans les dernières parties.

24
tmhs

Modifier:

La solution la plus simple pour que hjust/vjust se comporte intelligemment consiste à ajouter l’esthétique group à geom_text puis hjust & position s’ajuste automatiquement pour le group.

1. Orientation verticale

ggplot(data) + 
  geom_bar(
    aes(x = name, y = count, fill = week, group = week), 
    stat='identity', position = 'dodge'
  ) +
  geom_text(
    aes(x = name, y = count, label = count, group = week),
    position = position_dodge(width = 1),
    vjust = -0.5, size = 2
  ) + 
  theme_bw()

Cela donne:

enter image description here

2. Orientation horizontale

ggplot(data) + 
  geom_bar(
    aes(x = name, y = count, fill = week, group = week), 
    stat='identity', position = 'dodge'
  ) +
  geom_text(
    aes(x = name, y = count, label = count, group = week), 
    hjust = -0.5, size = 2,
    position = position_dodge(width = 1),
    inherit.aes = TRUE
  ) + 
  coord_flip() + 
  theme_bw()

Cela donne:

enter image description here


Ce n'est pas nécessairement la manière la plus générale de procéder, mais vous pouvez avoir une variable fill dépendante hjust (ou vjust, selon l'orientation). Je ne sais pas tout à fait comment sélectionner la valeur du paramètre d’ajustement, et c’est actuellement basé sur l’aspect correct . Peut-être que quelqu'un d'autre peut suggérer un moyen plus général de choisir cette valeur de paramètre.

1. Orientation verticale

library(dplyr)
library(ggplot2)

# generate some data
data = data_frame(
  week = as.factor(rep(c(1, 2), times = 5)),
  name = as.factor(rep(LETTERS[1:5], times = 2)),
  count = rpois(n = 10, lambda = 20),
  hjust = if_else(week == 1, 5, -5),
  vjust = if_else(week == 1, 3.5, -3.5)
)

# Horizontal
ggplot(data) + 
  geom_bar(
    aes(x = name, y = count, fill = week, group = week), 
    stat='identity', position = 'dodge'
  ) +
  geom_text(
    aes(x = name, y = count, label = count, vjust = vjust), 
    hjust = -0.5, size = 2,
    inherit.aes = TRUE
  ) + 
  coord_flip() + 
  theme_bw() 

Voici à quoi ça ressemble:

enter image description here

2. Orientation horizontale

ggplot(data) + 
  geom_bar(
    aes(x = name, y = count, fill = week, group = week), 
    stat='identity', position = 'dodge'
  ) +
  geom_text(
    aes(x = name, y = count, label = count, vjust = vjust), 
    hjust = -0.5, size = 2,
    inherit.aes = TRUE
  ) + 
  coord_flip() + 
  theme_bw()

Voici à quoi ça ressemble:

enter image description here

35
tchakravarty

L'instruction position_dodge() prend un paramètre width. Pour vous assurer que le texte est centré à la fin des barres (c’est-à-dire que la largeur d’esquive des barres et le texte doivent être identiques), attribuez le même paramètre width à l’instruction position_dodge() dans geom_bar et dans geom_text.

Il existe également un paramètre width pour geom_bar, c'est la largeur des barres. Si vous voulez que les barres se touchent dans chaque name, faites en sorte que la largeur de la barre soit la même que la largeur d'évitement; si vous voulez un petit espace entre les barres, réglez la largeur de la barre un peu moins que la largeur en évitant.

Si vous utilisez une esthétique globale, vous n’aurez pas besoin d’une esthétique group (toutefois, si vous utilisez uniquement une esthétique locale, vous aurez besoin d’une esthétique de groupe pour geom_text).

hjust = -0.5 positionnera les étiquettes de texte juste au-delà de la fin des barres; hjust = 1.5 les place à l'intérieur des barres.

library(ggplot2)

# Generate some data - using @tchakravarty's data - Thanks.
df = data.frame(
  week = as.factor(rep(c(1, 2), times = 5)),
  name = as.factor(rep(LETTERS[1:5], times = 2)),
  count = rpois(n = 10, lambda = 20))

position = position_dodge(width = .75)
width = .75

ggplot(df, aes(x = name, y = count, label = count, fill = week)) + 
  geom_bar(width = width, stat='identity', position = position) +
  geom_text(hjust = -0.5, size = 2, position = position) +
  coord_flip() + 
  theme_bw()



# To separate the bars slightly:
position = position_dodge(width = .75)
width = .65

ggplot(df, aes(x = name, y = count, label = count, fill = week)) + 
  geom_bar(width = width, stat='identity', position = position) +
  geom_text(hjust = -0.5, size = 2, position = position) +
  coord_flip() + 
  theme_bw()
6
Sandy Muspratt