Непоследовательность в сложенном гистограмме - PullRequest
0 голосов
/ 18 апреля 2019

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

На данный момент я сделал следующее:

df = structure(list(Type = c("Bronchoscopy", "Bronchoscopy", "Endoscopy", 
"Endoscopy"), Bacteremia = structure(c(1L, 2L, 1L, 2L), .Label = c("False", 
"True"), class = "factor"), count = c(2710L, 64L, 13065L, 103L
), perc = c(97.6928622927181, 2.3071377072819, 99.2178007290401, 
0.782199270959903)), class = c("grouped_df", "tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -4L), groups = structure(list(
Type = c("Bronchoscopy", "Endoscopy"), .rows = list(1:2, 
    3:4)), row.names = c(NA, -2L), class = c("tbl_df", "tbl", 
"data.frame"), .drop = TRUE))

ggplot(df, aes(x = Type, y = perc, fill = Bacteremia)) +
geom_bar(stat = "identity") +
ylab("percent") + 
geom_text(aes(label = paste0(round(perc, 2), "%")), position = 
position_stack(vjust = -0.1), color = "black", fontface = "bold") 

Кажется, я не понимаю vjust правильно. Кажется, что он не ведет себя одинаково для нижней и верхней полос. Чего я хотел бы добиться, так это разместить проценты немного выше верхнего края каждого столбца.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Вот один из способов сделать это:

df <- 
  tibble(
    Type = c("Bronchoscopy", "Bronchoscopy", "Endoscopy", "Endoscopy"),
    Bacteremia = c("False", "True", "False", "True"),
    count = c(2710L, 64L, 13065L, 103L)
  ) %>% 
  group_by(Type) %>% 
  mutate(Percent = round((count / sum(count) * 100), 1))

df %>% 
  ggplot(aes(x = Type, y = Percent, fill = Bacteremia)) +
  geom_col() +
  geom_label(
    data = . %>% filter(Bacteremia == "True"), 
    aes(y = Percent + 5, label = str_c(Percent, "%")),
    show.legend = FALSE
  ) + 
  geom_label(
    data = . %>% filter(Bacteremia == "False"), 
    aes(y = 105, label = str_c(Percent, "%")),
    show.legend = FALSE
  )

Варианты 5 и 105 работают на моем компьютере, но, возможно, потребуется немного подкорректировать их в зависимости от ваших конкретных настроек и соотношения сторон.Первый вызов geom_label устанавливает ось Y на основе точного процента, в то время как второй устанавливает ее на постоянном уровне над столбцами.

Возможно, вы захотите поэкспериментировать с использованием geom_text против geom_label, чтобы поэкспериментировать с различными настройками цвета и метки.Хорошая особенность geom_label заключается в том, что она очень четко покажет, какая группа помечена.

1 голос
/ 18 апреля 2019

Вот возможный подход:

ggplot(df, aes(x = Type, y = perc, fill = Bacteremia)) +
  geom_bar(stat = "identity") +
  ylab("percent") + 
  geom_text(aes(label = paste0("", round(perc, 2), "%\n"), y = perc),
            color = "black", fontface = "bold", nudge_y = 2) 

Я должен пояснить, что ggplot2 попытается разместить geom_text() относительно данных.Если вы пытаетесь выровнять текстовые метки по горизонтали, вам нужно будет либо использовать annotate(), либо предоставить набор данных маркировки с type, percent и Bacteremia и вызвать его в geom_text(), как показано ниже.

labdf <- cbind(df, ypos = c(103, 5, 103, 5))

ggplot(df, aes(x = Type, y = perc, fill = Bacteremia)) +
  geom_bar(stat = "identity") +
  ylab("percent") + 
  geom_text(data = labdf,
            aes(label = paste0("", round(perc, 2), "%"), y = ypos, x = Type),
            color = "black", fontface = "bold") 
...