2016-07-12 2 views
2

Я пытаюсь использовать преобразование пользовательских масштаба/оси, например, так:GGplot пользовательских масштабного преобразования с пользовательскими клещами

library(ggplot2) 
library(scales) 

dat <- data.frame(
    time.tot = c(407.17, 168.83, 127.8, 108.88, 69.04, 68.5, 59.76, 407.17, 
       168.83, 127.8, 108.88, 69.04, 68.5, 59.76, 407.17, 168.83, 127.8, 
       108.88, 69.04, 68.5, 59.76), 
    error = c(0, 0.01, 0.05, 0.1, 0.5, 0.7, 1, 1.91e-06, 0.00229, 0.00884, 
      0.0172, 0.128, 0.128, 0.22, 1.43e-08, 0.000337, 0.00121, 0.00221, 
      0.0123, 0.0123, 0.0213, 0, 0.01, 0.05, 0.1, 0.5, 0.7, 1, 1.91e-06, 
      0.00229, 0.00884, 0.0172, 0.128, 0.128, 0.22, 1.43e-08, 0.000337, 
      0.00121, 0.00221, 0.0123, 0.0123, 0.0213), 
    type = rep(c("A", "B", "C"), each=7)) 

eps <- 1e-8 
tn <- trans_new("logpeps", 
       function(x) log(x+eps), 
       function(y) exp(y)-eps, 
       domain=c(0, Inf), 
       breaks=c(0, 0.1, 1)) 

ggplot(dat, aes(x=time.tot, y=error, color=type)) + 
    geom_line() + geom_point() + coord_trans(y = tn) 

enter image description here

Как вы можете видеть, ось у действительно трансформируется по моей указанной функции, y=log(x+eps). Однако аргумент breaks не имеет никакого эффекта. Я уверен, что я указываю, что это неправильно, но я не смог выяснить из документов, как заставить его работать. Какие-либо предложения?

Мне также интересно, как «исправить» извилистые линии - похоже, они нарисованы в оригинальной шкале, а затем преобразованы с использованием моего пользовательского tn.

ответ

3

Вам может понадобиться установить масштаб по оси Y. непосредственно:

ggplot(dat, aes(x=time.tot, y=error, color=type)) + 
    geom_line() + geom_point() + coord_trans(y = tn) 
    + scale_y_continuous(breaks = c(0,0.1,1)) 

Кроме того, не-прямые линии ожидаемое поведение coord_trans. из справки: «coord_trans отличается от масштабных преобразований тем, что происходит после статистической трансформации и будет влиять на внешний вид геометров - нет никакой гарантии, что прямые линии будут оставаться прямыми».

Вместо этого попробуйте:

b <- 10^-c(Inf, 8:0) 
ggplot(dat, aes(x=time.tot, y=error, color=type)) + 
    geom_line() + geom_point() + scale_y_continuous(breaks = b, labels=b, trans = tn) 

enter image description here

+0

совершенны, спасибо! Я добавлю изменения к вашему ответу, чтобы показать сюжет, в котором я закончил. –