Як змінити форматування чисел на осі за допомогою ggplot?


131

Я використовую 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")

Будь-яка допомога дуже цінується.


30
Будьте уважні, описуючи ggplotпараметри за замовчуванням як "очевидно неприйнятні". Ви маєте на увазі, що маєте особисті переваги щодо іншого формату. Число у форматі 4e+05є науковим позначенням, і воно буде кращим форматуванням у найрізноманітніших програмах.
Андрі

53
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

FYI, це також працює з scale_y_log10 (мітки = масштаби :: кома), і я припускаю, що інші масштаби в 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 х 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)

Коли я спробую це, я отримую помилку, що формат не є невикористаним аргументом? Чи потрібен інший пакет чи щось таке?
Джек Едлі

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) 

23
Це можна скоротити за допомогою анонімної функції: scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})Чому немає такого попередньо визначеного форматера, пекло знає.
eMPee584
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.