2012-05-25 22 views
15

Z nową wersją ggplot2 i wagą, nie mogę wymyślić, jak uzyskać etykietę osi w notacji naukowej. NpJak sformatować etykiety osi za pomocą wykładników za pomocą ggplot2 i skale?

x <- 1:4 
y <- c(0, 0.0001, 0.0002, 0.0003) 

dd <- data.frame(x, y) 

ggplot(dd, aes(x, y)) + geom_point() 

daje mi

Example ggplot with scales

ja jak etykiety osi wynosi 0, 5 x 10^-5, 1 x 10^-4, 1,5 x 10^-4, itp. Nie mogę znaleźć prawidłowej kombinacji scale_y_continuous() i math_format() (przynajmniej myślę, że to są to, czego potrzebuję).

log przekształca oś, której nie chcę. scale_y_continuous(label = math_format()) daje mi tylko 10^0, 10^5e-5 itd. Rozumiem, dlaczego ten drugi daje taki wynik, ale nie tego szukam.

Używam ggplot2_0.9.1 i scales_0.2.1

+0

jestem zmieszany; te wartości (0, 5^-5, 1^-4, 1.5^-4) tak naprawdę nie pasują do zakresów danych na wykresie. – joran

+0

Poprawnie - to nie było jasne. Edytowałem teraz. – kmm

+0

Możliwy duplikat http://stackoverflow.com/questions/9651903/ggplot2-y-axis-ticks-not-showing-up-on-a-log-scale? –

Odpowiedz

23

I dostosowany odpowiedź Briana i myślę, że to, czego jesteś po.

prostu dodając parse() do scientific_10() funkcji (i zmiana 'x' do symbolu poprawna 'czasy), możesz skończyć z tym:

x <- 1:4 
y <- c(0, 0.0001, 0.0002, 0.0003) 

dd <- data.frame(x, y) 

scientific_10 <- function(x) { 
    parse(text=gsub("e", " %*% 10^", scales::scientific_format()(x))) 
} 

ggplot(dd, aes(x, y)) + geom_point()+scale_y_continuous(label=scientific_10) 

enter image description here

Nadal możesz chcieć ulepszyć tę funkcję, aby zajmowała się 0 trochę bardziej elegancko, ale myślę, że to już wszystko!

+0

Dziękuję za tę odpowiedź. To rozwiązanie działa, ale wypisuje liczbę taką jak 1e + 03 jako 10^+ 03. Czy istnieje sposób na wydrukowanie go w postaci 10^3? –

+0

@ zx8754 nadal działa dla mnie. ggplot 2.2.1, R wersja 3.4.2 –

10
scale_y_continuous(label=scientific_format()) 

daje etykiety z e zamiast 10:

enter image description here

Przypuszczam, że jeśli naprawdę chcą 10 tam jest, można następnie zawiń to w inną funkcję.

scientific_10 <- function(x) { 
    gsub("e", " x 10^", scientific_format()(x)) 
} 

ggplot(dd, aes(x, y)) + geom_point() + 
    scale_y_continuous(label=scientific_10) 

enter image description here

+0

Próbowałem znaleźć sposób na połączenie tego ze strategią w 'math_format()', aby poprawnie wyposażyć wykładniki, ale było to skomplikowane. – joran

+0

Czy można uzyskać wykładniki jako rzeczywiste wykładniki? W przeciwnym razie tego właśnie szukam. – kmm

+0

@Kevin To może być. Ogólnym podejściem byłoby przygotowanie etykietowych wyrażeń. Nie wiem, czy możesz zwrócić wyrażenia dla funkcji etykiet, czy nie. Próbowałem kilku rzeczy, ale nie mogłem łatwo uzyskać nic do pracy. Mam nadzieję, że ktoś inny zadzwoni. –

18

Jak na komentarze dotyczące przyjętego rozwiązania, PO szuka formatować wykładniki jak wykładniki. Można to zrobić z funkcjami trans_format i trans_breaks w wagi opakowaniu:

library(ggplot2) 
    library(scales) 

    x <- 1:4 
    y <- c(0, 0.0001, 0.0002, 0.0003) 
    dd <- data.frame(x, y) 

    ggplot(dd, aes(x, y)) + geom_point() + 
    scale_y_log10("y", 
     breaks = trans_breaks("log10", function(x) 10^x), 
     labels = trans_format("log10", math_format(10^.x))) 

enter image description here

+0

Dziękuję za tę odpowiedź. Próbowałem, ale mam spisek do góry nogami. https://stackoverflow.com/questions/46639120/ggplot2-transform-y-axis-in-bar-plot-using-scale-y-log10. Będę wdzięczny za twoje sugestie. – aelwan

+0

@aelwan: Odpowiem w innym wątku, ale skala logarytmiczna tak naprawdę nie działa z grotem, ponieważ nie może być żadnego znaku zerowego. Rozważałbym użycie funkcji geom_errorbar(), a nie geom_bar(). – computermacgyver

4

Napisałem wersję scientific_10, która omija pakiet wagi; usuwa także wiodące zera w wykładnikach (10^04 do 10^4 itd.). Zostało to dostosowane z pomocnych odpowiedzi podanych powyżej.

Podaję również funkcje wagi owijki poniżej.

scientific_10 <- function(x) { 
    xout <- gsub("1e", "10^{", format(x),fixed=TRUE) 
    xout <- gsub("{-0", "{-", xout,fixed=TRUE) 
    xout <- gsub("{+", "{", xout,fixed=TRUE) 
    xout <- gsub("{0", "{", xout,fixed=TRUE) 
    xout <- paste(xout,"}",sep="") 
    return(parse(text=xout)) 
} 

scale_x_log10nice <- function(name=NULL,omag=seq(-10,20),...) { 
    breaks10 <- 10^omag 
    scale_x_log10(name,breaks=breaks10,labels=scientific_10(breaks10),...) 
} 

scale_y_log10nice <- function(name=NULL,omag=seq(-10,20),...) { 
    breaks10 <- 10^omag 
    scale_y_log10(name,breaks=breaks10,labels=scientific_10(breaks10),...) 
} 

scale_loglog <- function(...) { 
    list(scale_x_log10nice(...),scale_y_log10nice(...)) 
} 

qplot(x=exp(5*rnorm(100)),geom="density",kernel="rectangular") + 
    scale_x_log10nice() 
2

riffy off Toma odpowiedzi powyżej, następujące usuwa znaki + i obsługuje 0 lepsza (funkcja jest anonimowo inlined również):

scale_y_continuous(label= function(x) {ifelse(x==0, "0", parse(text=gsub("[+]", "", gsub("e", " %*% 10^", scientific_format()(x)))))}) + 
Powiązane problemy