2017-12-19 294 views
7

Jak zmodyfikować etykietę osi X w formacie 2^x, gdy x jest w skali log2?Jak sformatować etykietę zaznaczenia osi X w formacie 2^x?

Kiedy pojawia się na wykresie, x powinno być w indeksie górnym.

+1

Jeśli x jest już w skali logarytmicznej, wystarczy zmodyfikować etykiety, np. df <- data.frame (x = 1: 4, y = 1: 4); ggplot (df) + geom_point (aes (y = y, x = x)) + scale_x_continuous (labels = paste0 ("2 ^", 1: 4)) –

Odpowiedz

8

Oto sposób wykonania niestandardowej funkcji transformacji i etykietowania. Powinien działać na arbitralnych danych.

library(ggplot2) 

label_log2 <- function(x) parse(text = paste0('2^', log(x, 2))) 

ggplot(mtcars, aes(mpg, cyl)) + 
    geom_point() + 
    scale_x_continuous(
     trans = 'log2', 
     labels = label_log2) 

enter image description here


Według komentarza alistaire, możemy również formatowanie osi etykiety z funkcji oferowanych przez scales opakowania:

library(scales) 

ggplot(mtcars, aes(mpg, cyl)) + 
    geom_point() + 
    scale_x_continuous(
     trans = 'log2', 
     labels = trans_format('log2', math_format(2^.x))) 

Tutaj trans_format sformatuje etykiet po określonej transformacji .


Według instrukcji:

trans
Albo nazwa obiektu transformacji, albo sam obiekt . Wbudowane transformacje obejmują "asn", "atanh", "boxcox", "exp", "identity", "log", "log10", "log1p", "log2", "logit", "prawdopodobieństwo" , "probit", "reciprocal", "reverse" i "sqrt".

Obiekt transformacji łączy w sobie transformację, jest odwrotną i metody generowania podziałów i etykiet. Obiekty transformacji to zdefiniowane w pakiecie wag i nazywane są name_trans, np. boxcox_trans. Możesz stworzyć własną transformację za pomocą trans_new.

trans powinny być przedmiotem transformacji (jak wartości zwracanej przez wywołanie scales::log2_trans) lub imię wbudowanym transformacji, więc możemy również użyć trans = scales::log2_trans() zamiast trans = 'log2'.

+0

Wycofane, ale czy nie wydaje się, że jeden argument jest przekazywane jako wywołanie funkcji, a inne przekazane jako nazwa funkcji jest niespójne? –

+0

@ 42-, oczywiście, to wygląda dziwnie. 'labels' może przyjąć funkcję jako argument, a' trans' wymaga obiektu transformacji o nazwie wbudowanej. Parsowanie nazwy funkcji nie działa dla 'trans'. Zmieniłem odpowiedź, aby to odzwierciedlić. I uznałem, że lepiej byłoby użyć 'trans = 'log2''. – mt1022

+2

'skale' zapewnia również funkcje formatera. W tym przypadku nie jest to jedna z wcześniej napisanych, ale nie jest trudna do skonstruowania za pomocą dostępnych funkcji: 'labels = skale :: trans_format ('log2', skale :: format matematyczny (2^.x))' – alistaire