Jak zmienić formatowanie liczb na osi za pomocą ggplot?


131

Używam R i ggplot, aby narysować wykres rozrzutu niektórych danych, wszystko jest w porządku, z wyjątkiem tego, że liczby na osi y wychodzą z formatowaniem wykładników w stylu komputerowym, tj. 4e + 05, 5e + 05 itd. To jest oczywiście niedopuszczalne, więc chcę wyświetlić je jako 500 000, 400 000 i tak dalej. Dopuszczalne byłoby również uzyskanie prawidłowego zapisu potęgowego.

Kod działki jest następujący:

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

Każda pomoc bardzo doceniona.


30
Uważaj na opisywanie ggplotopcji domyślnych jako „oczywiście niedopuszczalnych”. Masz na myśli osobiste preferencje dotyczące innego formatu. Liczba w formacie 4e+05to notacja naukowa i byłaby preferowanym formatowaniem w wielu różnych zastosowaniach.
Andrie

53
4e + 05 nie jest notacją naukową, jest to przybliżenie komputerowe do notacji naukowej. Byłoby to nie do przyjęcia w żadnym czasopiśmie drukowanym, o którym myślę, więc uważam to za niedopuszczalne w mojej rozprawie.
Jack Aidley

Odpowiedzi:


126

Inną opcją jest formatowanie etykiet znaczników osi za pomocą przecinków przy użyciu pakietu scalesi dodawanie

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

do instrukcji ggplot.

Jeśli nie chcesz ładować paczki, użyj:

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

9
Niesamowite, że tak trywialny problem wymaga załadowania nowego pakietu.
luchonacho

FYI, działa to również z scale_y_log10 (labels = scales :: comma) i zakładam inne skale w ggplot2. Świetne wskazówki!
TheProletariat

66

Znalazłem również inny sposób zrobienia tego, który daje prawidłową notację „x10 (indeks górny) 5” na osiach. Publikuję go tutaj w nadziei, że może być przydatny dla niektórych. Dostałem stąd kod , więc nie rości sobie za niego uznania, słusznie trafia do Briana Diggsa.

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

Które możesz następnie użyć jako

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

10
Jeśli nie chcesz, aby 0 było drukowane jako „0 x 10⁺⁰”, dodaj poniższy format(...)wiersz poniżej wiersza:l <- gsub("0e\\+00","0",l)
semi-extrinsic

1
Jeśli chcesz zająć się innymi sprawami, najłatwiej jest dodać więcej gsub()bezpośrednio po format(), testując, co format()zwraca się dla twojej sprawy w osobnej konsoli.
semi-extrinsic

3
dodaj to przed ostatnim gsubpoleceniem: # remove + after exponent, if exists. E.g.: (3x10^+2 -> 3x10^2) l <- gsub("e\\+","e",l)a po nim: # convert 1x10^ or 1.000x10^ -> 10^ l <- gsub("\\'1[\\.0]*\\'\\%\\*\\%", "", l)aby było to w formacie zwykle używanym w artykułach.
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)

Kiedy próbuję tego, pojawia się błąd, że formater jest nieużywanym argumentem? Czy potrzebny jest inny pakiet czy coś?
Jack Aidley

4
Zmieniłem kod, aby uwzględnić library(scales)i używać, commaktóry powinien działać lepiej niż funkcja, którą miałem wcześniej.
DiscreteCircle

16

Spóźniłem się na grę, ale na wypadek, gdyby inni chcieli łatwego rozwiązania, stworzyłem zestaw funkcji, które można nazwać:

 ggplot + scale_x_continuous(labels = human_gbp)

które dają czytelne dla człowieka liczby dla osi x lub y (lub ogólnie dowolną liczbę).

Możesz znaleźć funkcje tutaj: Github Repo Po prostu skopiuj funkcje do swojego skryptu, aby móc je wywołać.


10

Uważam, że sugerowana odpowiedź Jacka Aidleya jest użyteczna.

Chciałem wyrzucić inną opcję. Załóżmy, że masz szereg z wieloma małymi liczbami i chcesz mieć pewność, że etykiety osi zapisują pełny punkt dziesiętny (np. 5e-05 -> 0,0005), a następnie:

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
Można to skrócić, używając funkcji anonimowej: scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})dlaczego nie ma takiego predefiniowanego programu formatującego, do diabła.
eMPee584
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.