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

131

Я использую R и ggplot, чтобы нарисовать диаграмму рассеяния некоторых данных, все в порядке, за исключением того, что числа на оси Y выходят с форматированием экспоненты в компьютерном стиле, то есть 4e + 05, 5e + 05 и т. Д. Это, очевидно, неприемлемо, поэтому я хочу, чтобы он отображал их как 500000, 400000 и так далее. Также было бы приемлемо получение правильного обозначения экспоненты.

Код для сюжета следующий:

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")

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

Джек Эйдли
источник
30
Будьте осторожны, описывая ggplotпараметры по умолчанию как «явно неприемлемые». Вы имеете в виду, что у вас есть личные предпочтения в пользу другого формата. Число в формате 4e+05представляет собой научную запись и будет предпочтительным форматированием в самых разных приложениях.
Андри
54
4e + 05 - это не научная запись, это компьютерное приближение к научной записи. Это неприемлемо для любого печатного журнала, о котором я могу думать, поэтому я считаю это неприемлемым для моей диссертации.
Джек Эйдли

Ответы:

126

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

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

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

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

scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = scales::comma)
Джим М.
источник
9
Удивительно, что такая тривиальная проблема требует загрузки нового пакета.
luchonacho 05
К вашему сведению, это также работает с scale_y_log10 (labels = scale :: comma), и я предполагаю другие масштабы в ggplot2. Отличные советы!
TheProletariat
66

Я также нашел другой способ сделать это, который дает правильную нотацию «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) 
Джек Эйдли
источник
10
Если вы не хотите, чтобы 0 выводился как «0 x 10⁺⁰», добавьте следующее под format(...)строкой:l <- gsub("0e\\+00","0",l)
полу-внешний
1
Если вы хотите выделить другие вещи в особом случае, проще всего добавить их gsub()сразу после format(), пока вы проверяете, что format()возвращается для вашего дела, в отдельной консоли.
полу-внешний
3
добавьте это перед последней gsubкомандой: # remove + after exponent, if exists. E.g.: (3x10^+2 -> 3x10^2) l <- gsub("e\\+","e",l)и после нее: # convert 1x10^ or 1.000x10^ -> 10^ l <- gsub("\\'1[\\.0]*\\'\\%\\*\\%", "", l)чтобы сделать это в формате, обычно используемом в статьях.
John_West
44
x <- rnorm(10) * 100000
y <- seq(0, 1, length = 10)
p <- qplot(x, y)
library(scales)
p + scale_x_continuous(labels = comma)
DiscreteCircle
источник
Когда я пытаюсь это сделать, я получаю сообщение об ошибке, что форматтер - неиспользуемый аргумент? Нужен ли другой пакет или еще что?
Джек Эйдли
4
Я изменил код, чтобы включить library(scales)и использовать, commaкоторый должен работать лучше, чем функция, которая у меня была раньше.
DiscreteCircle
16

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

 ggplot + scale_x_continuous(labels = human_gbp)

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

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

Фергал Райан
источник
10

Я считаю предложенный Джеком Эйдли ответ полезным.

Хотел выкинуть другой вариант. Предположим, у вас есть серия с большим количеством маленьких чисел, и вы хотите, чтобы метки осей записывали полную десятичную точку (например, 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) 
EconomiCurtis
источник
23
Это можно сократить, используя анонимную функцию: scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})почему нет такого предопределенного средства форматирования, черт его знает.
eMPee584