Как изменить количество знаков после запятой на метки оси в ggplot2?

В частности, это в facet_grid. Широко распространены по аналогичным вопросам, но не ясны по синтаксису или по тому, где он идет. Я хочу, чтобы для каждого числа по у-оси имелось две цифры после десятичной точки, даже если конечная цифра равна 0. Является ли это параметром в scale_y_continuous или element_text или...?

row1 <- ggplot(sector_data[sector_data$sector %in% pages[[x]],], aes(date,price)) + geom_line() +
  geom_hline(yintercept=0,size=0.3,color="gray50") +
  facet_grid( ~ sector) +
  scale_x_date( breaks='1 year', minor_breaks = '1 month') +
  scale_y_continuous( labels = ???) +
  theme(panel.grid.major.x = element_line(size=1.5),
        axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.title.y=element_blank(),
        axis.text.y=element_text(size=8),
        axis.ticks=element_blank()
  )

Ответ 1

Из справки для ?scale_y_continuous аргумент "метки" может быть функцией:

Один из ярлыков:

  • NULL без меток

  • waiver() для меток по умолчанию, вычисленных объектом преобразования

  • Вектор символов с метками (должен быть такой же длины, что и разрывы)

  • Функция, которая принимает разрывы в качестве входных данных и возвращает метки в качестве выходных данных

Мы будем использовать последнюю опцию, функцию, которая принимает breaks в качестве аргумента и возвращает число с двумя десятичными знаками.

#Our transformation function
scaleFUN <- function(x) sprintf("%.2f", x)

#Plot
library(ggplot2)
p <- ggplot(mpg, aes(displ, cty)) + geom_point()
p <- p + facet_grid(. ~ cyl)
p + scale_y_continuous(labels=scaleFUN)

enter image description here

Ответ 2

В пакете "scale" есть несколько приятных функций для форматирования осей. Одной из этих функций является number_format(). Так что вам не нужно сначала определять свою функцию.

library(ggplot2)
# building on Pierre answer
p <- ggplot(mpg, aes(displ, cty)) + geom_point()
p <- p + facet_grid(. ~ cyl)

# here comes the difference
p + scale_y_continuous(
  labels = scales::number_format(accuracy = 0.01))

# the function offers some other nice possibilities, such as controlling your decimal 
# mark, here ',' instead of '.'
p + scale_y_continuous(
  labels = scales::number_format(accuracy = 0.01,
                                 decimal.mark = ','))