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.

Jack Aidley
źródło
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)
Jim M.
źródło
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) 
Jack Aidley
źródło
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)
DiscreteCircle
źródło
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ć.

Feargal Ryan
źródło
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) 
EconomiCurtis
źródło
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