Как добавить проценты и дроби к ярлыку ggplot geom_text?

У меня есть набор данных, в котором меня интересует оценка результатов теста и процент людей, переживших событие:

dat <- data.frame(score = 1:7,
              n.event = c(263,5177,3599,21399,16228,10345,1452),
              n.total = c(877,15725,13453,51226,32147,26393,7875),
              percentage = c(30,33,27,42,50,39,18))

Я могу построить это с процентами на графике, как это:

ggplot(data=dat, aes(x=score, y=percentage)) +
  geom_line() +
  geom_text(aes(label = paste0(dat$percentage,"%")))

Или я могу построить это с дробями, как это:

ggplot(data=dat, aes(x=score, y=percentage)) +
  geom_line() +
  geom_text(aes(label = paste0("frac(",dat$n.event, ",", dat$n.total, 
  ")")),parse = TRUE)

Но я хочу, чтобы они оба были рядом. Это не работает:

ggplot(data=dat, aes(x=score, y=percentage)) +
  geom_line() +
  geom_text(aes(label = paste0(dat$percentage,"%","frac(",dat$n.event, 
  ",", dat$n.total, ")")),parse = TRUE)

Я получаю эту ошибку:

Ошибка при разборе (text = as.character(lab))::1:3: неожиданный ввод 1: 30% разрыва (263 877) ^

Спасибо за помощь!

2 ответа

Решение

Проблема в том, что parse=True говорит geom_text использовать R математическую аннотацию (описано в ?plotmath). В этой аннотации, % является специальным символом, который должен быть экранирован, а пробелы также игнорируются.

Для того, чтобы помириться между % и остальная часть формулы, мы должны избежать этого, используя '%', объединить его с предыдущим словом, используя *и добавить пробел после использования ~, Результат:

ggplot(data=dat, aes(x=score, y=percentage)) +
     geom_line() +
     geom_text(aes(label = paste0(dat$percentage,"*\'%\'~","frac(",dat$n.event, 
                                  ",", dat$n.total, ")")),parse = TRUE)

Как насчет чего-то вроде этого:

ggplot(data=dat, aes(x=score, y=percentage)) +
  geom_line() +
  geom_text(aes(label = paste0(dat$percentage,"%"))) + 
  geom_text(aes(label = paste0("frac(",dat$n.event, ",", dat$n.total, 
  ")")),parse = TRUE, nudge_x = 0.0, nudge_y = -2)

Играть с nudge_x а также nudge_y параметры, чтобы получить метки в нужную позицию

Другие вопросы по тегам