Как изменить форматирование чисел на оси с помощью ggplot?

Я использую R и ggplot, чтобы нарисовать диаграмму рассеяния некоторых данных, все отлично, за исключением того, что числа на оси y выходят с форматированием экспоненциального стиля компьютера, то есть 4e + 05, 5e + 05 и т.д. Это явно неприемлемо, поэтому я хочу, чтобы он отображал их как 500 000, 400 000 и так далее. Получение правильной нотации показания также будет приемлемым.

Код для графика выглядит следующим образом:

p <- ggplot(valids, aes(x=Test, y=Values)) +
  geom_point(position="jitter") +
  facet_grid(. ~ Facet) +
  scale_y_continuous(name="Fluorescent intensity/arbitrary units") +
  scale_x_discrete(name="Test repeat") +
  stat_summary(fun.ymin=median, fun.ymax=median, fun.y=median, geom="crossbar")

Любая помощь очень ценится.

Ответ 1

Я также нашел другой способ сделать это, что дает правильную 'x10 (верхний индекс) 5' нотацию по осям. Я размещаю его здесь в надежде, что это может быть полезно для некоторых. Я получил код здесь, поэтому я не претендую на это, это справедливо касается Брайана Диггса.

fancy_scientific <- function(l) {
     # turn in to character string in scientific notation
     l <- format(l, scientific = TRUE)
     # quote the part before the exponent to keep all the digits
     l <- gsub("^(.*)e", "'\\1'e", l)
     # turn the 'e+' into plotmath format
     l <- gsub("e", "%*%10^", l)
     # return this as an expression
     parse(text=l)
}

Что вы затем можете использовать как

ggplot(data=df, aes(x=x, y=y)) +
   geom_point() +
   scale_y_continuous(labels=fancy_scientific) 

Ответ 2

Другой вариант - отформатировать метки тика вашей оси запятыми, используя пакет scales и добавить

 scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = comma)

в ваш оператор ggplot.

Если вы не хотите загружать пакет, используйте:

scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = scales::comma)

Ответ 3

x <- rnorm(10) * 100000
y <- seq(0, 1, length = 10)
p <- qplot(x, y)
library(scales)
p + scale_x_continuous(labels = comma)

Ответ 4

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

 ggplot + scale_x_continuous(labels = human_gbp)

которые дают вам человекочитаемые числа для осей x или y (или вообще любое число вообще).

Здесь вы можете найти функции: Github Repo Просто скопируйте функции в свой script, чтобы вы могли их вызвать.

Ответ 5

Я нахожу, что Джек Эйдли предложил ответ полезный.

Я хотел выбросить еще один вариант. Предположим, у вас есть серия со многими маленькими числами, и вы хотите, чтобы метки оси записывали полную десятичную точку (например, 5e-05 → 0.0005), затем:

NotFancy <- function(l) {
 l <- format(l, scientific = FALSE)
 parse(text=l)
}

ggplot(data = data.frame(x = 1:100, 
                         y = seq(from=0.00005,to = 0.0000000000001,length.out=100) + runif(n=100,-0.0000005,0.0000005)), 
       aes(x=x, y=y)) +
     geom_point() +
     scale_y_continuous(labels=NotFancy)