Масштабирование ggplot () с помощью scale ::cent_format () приводит к странным результатам - PullRequest
0 голосов
/ 10 ноября 2018
library(tidyverse)
mtcars %>% 
  count(cyl) %>% 
  mutate(prop = n / sum(n)) %>% 
  ggplot(aes(x = cyl, y = prop)) + 
  geom_point() + 
  scale_y_continuous(labels = scales::percent_format(accuracy = 5L))

Если я использую scales::percent() выше вместо scales::percent_format(accuracy = 5L), я получу десятичные разряды в процентных метках, которые мне не нужны.

Вопрос - что делает 5L в моем примере выше? Почему мне нужно использовать целое число 5L вместо 5? И почему 6L меняет самое высокое значение y с 40% до 42%? Это просто странно.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Для 5 цифр после запятой

library(ggplot2)

library(tidyverse)

mtcars %>% 
  count(cyl) %>% 
  mutate(prop = n / sum(n)) %>% 
  ggplot(aes(x = cyl, y = prop)) + 
  geom_point() + 
  scale_y_continuous(labels = scales::percent_format(accuracy=.00001))
0 голосов
/ 10 ноября 2018

Во-первых, его не нужно точно указывать как целое число (т. Е. 5 работает просто отлично ).

Во-вторых, вы можете сделать ?scales::percent_format в любое время в консоли R (это бесплатно!). Это говорит вам об этой функции:

percent_format(
  accuracy = NULL, scale = 100, prefix = "", suffix = "%",
  big.mark = " ", decimal.mark = ".", trim = TRUE, ...
)

Итак, он принимает много возможных параметров, каждый из которых имеет значения по умолчанию, а некоторые являются опциями (через ...).

По умолчанию для параметра accuracy установлено значение NULL. Если прокрутить немного вниз на странице справки для функции, которую мы видим:

  • accuracy: число к округлению, NULL для автоматического угадывания.

Если мы введем имя функции без символов или префикса ?, мы увидим весь источник. Это показывает, что в конечном итоге он вызывает scales::number(), который определяется как:

function (x, accuracy = 1, scale = 1, prefix = "", suffix = "", 
          big.mark = " ", decimal.mark = ".", trim = TRUE, ...) {
  if (length(x) == 0) return(character())
  accuracy <- accuracy %||% precision(x)
  x <- round_any(x, accuracy/scale)
  nsmall <- -floor(log10(accuracy))
  nsmall <- min(max(nsmall, 0), 20)
  ret <- format(scale * x, big.mark = big.mark, decimal.mark = decimal.mark, 
                trim = trim, nsmall = nsmall, scientific = FALSE, ...)
  ret <- paste0(prefix, ret, suffix)
  ret[is.infinite(x)] <- as.character(x[is.infinite(x)])
  ret[is.na(x)] <- NA
  ret
}

Это:

accuracy <- accuracy %||% precision(x)

говорит, что если accuracy не NULL, используйте его, иначе угадывайте с помощью функции precision().

Следующая строка после этого - окончательный ответ на ваш вопрос.

...