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.