Zmusza R do zatrzymania kreślenia skróconych etykiet osi - np. 1e + 00 w ggplot2

111

W ggplot2 jak mogę zatrzymać skracanie etykiet osi - np. 1e+00, 1e+01Wzdłuż osi x po wydrukowaniu? Idealnie chciałbym zmusić R do wyświetlenia rzeczywistych wartości, które w tym przypadku byłyby 1,10.

Każda pomoc bardzo doceniona.

JPD
źródło

Odpowiedzi:

135

Myślę, że szukasz tego:

require(ggplot2)
df <- data.frame(x=seq(1, 1e9, length.out=100), y=sample(100))
# displays x-axis in scientific notation
p  <- ggplot(data = df, aes(x=x, y=y)) + geom_line() + geom_point()
p

# displays as you require
require(scales)
p + scale_x_continuous(labels = comma)
Bieg
źródło
2
To zadziałało. Dziękuję Ci. Poza tym, jakie są inne opcje „etykiet” dla osi w ggplot2 z pakietem skal?
JPD
3
Zapraszam również do odwiedzenia tej strony ggplot2.org , była mi bardzo pomocna w podobnym problemie.
Marta Karas
64

Czy próbowałeś czegoś takiego:

options(scipen=10000)

przed spiskowaniem?

juba
źródło
3
Działa to poprzez ustalenie wyższej kary za decyzję o użyciu notacji naukowej. Więcej wyjaśnień w tej odpowiedzi: stackoverflow.com/a/18600721/1080804
ecoe
35

To tylko aktualizacja tego, co zrobił @Arun, ponieważ wypróbowałem go dzisiaj i nie zadziałało, ponieważ został zaktualizowany do

+ scale_x_continuous(labels = scales::comma)
Derek Corcoran
źródło
2
Odpowiedź @ Arun powinna działać dobrze tak, jak jest, być może zapomniałeś dołączyć require(scales)? Spowoduje to zaimportowanie pakietu zawierającego commaskalę. Jak odkryłeś, możesz również określić pakiet podczas odwoływania się do niego, zamiast wymagać go wcześniej.
cincodenada
17

Bardziej ogólnym rozwiązaniem scales::format_formatjest usunięcie notacji naukowej. Daje to również dużą kontrolę nad tym, jak dokładnie chcesz wyświetlać etykiety, w przeciwieństwie doscales::comma co ma miejsce tylko w przypadku oddzielania rzędów wielkości przecinkami.

Na przykład:

require(ggplot2)
require(scales)
df <- data.frame(x=seq(1, 1e9, length.out=100), y=sample(100))

# Here we define spaces as the big separator
point <- format_format(big.mark = " ", decimal.mark = ",", scientific = FALSE)

# Plot it
p  <- ggplot(data = df, aes(x=x, y=y)) + geom_line() + geom_point()
p + scale_x_continuous(labels = point)
user2739472
źródło
8

Istnieje rozwiązanie, które nie wymaga biblioteki wag.

Możesz spróbować:

# To deactivate scientific notation on y-axis:

    p + scale_y_continuous(labels = function(x) format(x, scientific = FALSE))

# To activate scientific notation on y-axis:

    p + scale_y_continuous(labels = function(x) format(x, scientific = TRUE))

# To deactivate scientific notation on x-axis:

    p + scale_x_continuous(labels = function(x) format(x, scientific = FALSE))

# To activate scientific notation on x-axis:

    p + scale_x_continuous(labels = function(x) format(x, scientific = TRUE))
Willian Adamczyk
źródło
2

Czy najprostszym ogólnym rozwiązaniem nie jest wyższe określenie kary, której używa R dla notacji naukowej?

tj. ustawić scipen()na liczbę, z którą czujesz się komfortowo.

Np. jeśli maksymalna oś na wykresach może wynosić 100 000, ustawienie scipen(200000)zapewni, że R (i ggplot) użyje standardowej notacji dla wszystkich liczb poniżej 200000 i nie będzie wymogu dodawania żadnych linii do funkcji ggplot.

Andrew Fraser
źródło
0

Rozszerzenie pierwotnego pytania o ułamki, np. 1, 0,1, 0,01, 0,001 itd. I unikanie końcowych zer

p + scale_x_continuous(labels = function(x) sprintf("%g", x))
mdeleeuw
źródło