Как я могу иметь разные метки geom_text () на граненой, составной гистограмме в R с помощью ggplot? - PullRequest
2 голосов
/ 12 апреля 2020

Я пытаюсь использовать facet_wrap со сложенными гистограммами, и мне бы хотелось, чтобы на столбцах были метки, отображающие значение каждой части столбца.

Используя в качестве примера набор данных diamonds:

Мой код geom_text работает нормально, когда есть только один график, хотя и для более коротких баров:

diamonds %>%
ggplot(aes(x = cut, fill = clarity)) +
geom_bar() +
geom_text(data = . %>% 
          group_by(cut, clarity) %>%
          tally() %>%
          ungroup() %>% 
          group_by(cut) %>%
          ungroup(),
        aes(y = n, label = n),
        position = position_stack(0.5),
        show.legend = FALSE) 

Маркированная гистограмма без фасетирования

Однако, когда я добавляю фасетку, все метки отображаются во всех отдельных фасетах:

diamonds %>%
  ggplot(aes(x = cut, fill = clarity)) +
  geom_bar() +
  facet_wrap(~ color) +
  geom_text(data = . %>% 
              group_by(cut, clarity) %>%
              tally() %>%
              ungroup() %>% 
              group_by(cut) %>%
              ungroup(),
            aes(y = n, label = n),
            position = position_stack(0.5),
            show.legend = FALSE)

Граненая гистограмма с копией маркировка

Как сделать так, чтобы метки отображались только на соответствующих столбцах?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 12 апреля 2020

Я думаю, вам нужно включить цвет в подсчет group_by +, чтобы его можно было назначить правильному фасету:

diamonds %>%
ggplot(aes(x = cut, fill = clarity)) +
geom_bar() +
facet_wrap(~ color,scale="free_y") +
geom_text(data = . %>% 
          count(cut, clarity,color),
            aes(y = n, label = n),size=1,
            position = position_stack(0.5),
            show.legend = FALSE)

enter image description here

2 голосов
/ 12 апреля 2020

Лично я считаю, что с специальной переменной ..count.. легче работать.

diamonds %>%
ggplot(aes(x = cut, fill = clarity)) +
  geom_bar() +
  facet_wrap(~ color,scale="free_y") +
  stat_count(geom = "text", 
             aes(y =..count.., label = ..count..),
             position=position_stack(0.5), size = 2)

enter image description here

...