2012-06-15 13 views
26

me gustaría hacer una parcela con una escala log10 x inversa usando ggplot2:¿Cómo obtener una escala inversa, log10 en ggplot2?

require(ggplot2) 
df <- data.frame(x=1:10, y=runif(10)) 
p <- ggplot(data=df, aes(x=x, y=y)) + geom_point() 

Sin embargo, parece que lo que pueda ya sea una escala log10 o una escala invertida:

p + scale_x_reverse() + scale_x_log10() 

log10 scale, but not reversed

p + scale_x_reverse() 

reversed scale, but not log10

Supongo que esto es lógico, si una capa solo puede tener una escala. Y ciertamente podría hackearlo haciendo la transformación de registro en el marco de datos yo mismo, df$xLog <- log10(df$x) pero esa solución es una parece contraria al espíritu de ggplot. ¿Hay alguna forma de obtener este tipo de trazado sin hacer transformaciones de datos externas a la llamada ggplot?

+2

esperaba que esto funciona tan bien, pero parece que es un poco complicado. Hubo una [solución alternativa] (https://groups.google.com/forum/?fromgroups#!searchin/ggplot2/reverse$20log$20scale/ggplot2/AfMf9L9y9fc/Qu-FnJLJaagJ) que parece estar rota en el la versión más reciente. Si @kohske o alguien no puede encontrar otra solución, podría hacer una buena solicitud de funciones. – joran

Respuesta

43

El enlace que @joran dio en su comentario da la idea correcta (construya su propia transformación), pero está desactualizado con respecto al nuevo paquete que ggplot2 usa ahora. En cuanto a log_trans y reverse_trans en el paquete escalas de guía e inspiración, una función reverselog_trans se puede hacer:

library("scales") 
reverselog_trans <- function(base = exp(1)) { 
    trans <- function(x) -log(x, base) 
    inv <- function(x) base^(-x) 
    trans_new(paste0("reverselog-", format(base)), trans, inv, 
       log_breaks(base = base), 
       domain = c(1e-100, Inf)) 
} 

Esto puede ser utilizado simplemente como:

p + scale_x_continuous(trans=reverselog_trans(10)) 

que da el terreno:

enter image description here

Utilizando un conjunto de datos ligeramente diferente para mostrar que el eje es definitivamente Invertida:

DF <- data.frame(x=1:10, y=1:10) 
ggplot(DF, aes(x=x,y=y)) + 
    geom_point() + 
    scale_x_continuous(trans=reverselog_trans(10)) 

enter image description here

+0

Me temo que esta solución ya no funciona: Error en reverselog_trans (10): no se pudo encontrar la función "trans_new" La adición explícita de scales :: trans_new solo da como resultado nuevos errores, la función de escalas parece haber sido actualizada :( – Richard

+2

@Richard Acabo de comprobarlo y funciona, pero el paquete 'escalas' debe estar adjunto a la ruta de búsqueda (' library ("scales") '). Eso no está claro en la respuesta (y puede no haber sido necesario en el tiempo). Actualizando. –

+0

Eso fácil ¿no? ¡Muchas gracias! – Richard

Cuestiones relacionadas