Geom_text Как разместить текст на панели, как я хочу?

Я хотел бы настроить текст на панели.

Я попытался настроить hjust/vjust для отображения, поскольку мне это нравится, но кажется, что он не работает должным образом.

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

введите описание изображения здесь

Поэтому я хотел бы, чтобы числа располагались на каждом баре, посередине, на правом краю, чтобы он читался без перекрытия, как последние части.

Ответ 1

Изменить:

Более легкое решение, чтобы заставить hjust/vjust вести себя разумно, - это добавить эстетику group к geom_text, а затем hjust и position настроить для group автоматически.

1. Вертикальная ориентация

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

Это дает:

введите описание изображения здесь

2. Горизонтальная ориентация

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

Это дает:

введите описание изображения здесь


Это не обязательно самый общий способ сделать это, но вы можете иметь переменную fill hjust (или vjust, в зависимости от ориентации). Мне не совсем понятно, как выбрать значение параметра настройки, и в настоящее время он основан на том, что выглядит правильно. Возможно, кто-то еще может предложить более общий способ выбора этого значения параметра.

1. Вертикальная ориентация

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

Вот что это выглядит:

введите описание изображения здесь

2. Горизонтальная ориентация

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

Вот что это выглядит:

введите описание изображения здесь

Ответ 2

Оператор position_dodge() принимает параметр ширины. Чтобы гарантировать, что текст будет центрирован в конце столбцов (т.е. Ширина уклонения для столбцов и текста будет одинаковой), укажите тот же параметр ширины для оператора position_dodge() в пределах geom_bar и внутри geom_text.

Существует также параметр ширины для geom_bar, то есть ширина баров. Если вы хотите, чтобы штыри прижаты друг к другу в каждом name, сделайте ширину полосы равной ширине уклонения; если вам нужен небольшой зазор между стержнями, сделайте ширину полосы чуть меньше ширины уклонения.

Если вы используете глобальную эстетику, вам не понадобится эстетика group (однако, используя только локальную эстетику, вам понадобится эстетическая группа для geom_text).

hjust = -0.5 будет позиционировать текстовые метки только за пределами баров; hjust = 1.5 позиционирует их в конце баров.

library(ggplot2)

# Generate some data - using @tchakravarty 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()

Ответ 3

@tchakravarty Я следовал твоему коду, но он не работает для меня. Вот мой код и скриншот ниже. Можете ли вы помочь мне центрировать этикетку с интервалом чуть выше планки? Нажмите здесь - скриншот

p <- ggplot(data=mrc, aes(x = Year, y = Total, fill = Year)) + 
  geom_bar(stat="identity", position = "dodge") +
  geom_text(
        aes(x = Year, y = Total, label = Total),
        position = position_dodge(width = 1),
        vjust = -0.5, size = 3
  ) +
  theme_bw() +
  scale_fill_manual(values = c("#115740","#B9975B","#D0D3D4","#F0B323")) +
  theme(axis.title.x=element_blank(),
        axis.title.y=element_blank(),
        legend.position = "none",
        plot.title = element_text(hjust = 0.5, face = "bold", colour = "#B9975B")) +
  ggtitle("Petitions") 

ggplotly(p)