¿Cómo obtener una escala inversa, log10 en ggplot2?

Me gustaría hacer un diagtwig con una escala invertida, log10 x usando 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 puedo una escala log10 o una escala invertida:

 p + scale_x_reverse() + scale_x_log10() 

escala log10, pero no invertida

 p + scale_x_reverse() 

escala inversa, pero no 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 dataframe yo mismo, df$xLog <- log10(df$x) pero esa solución 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?

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 de scales que ggplot2 usa ahora. Mirando log_trans y reverse_trans en el paquete de escalas para orientación e inspiración, se puede hacer una función reverselog_trans :

 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 se puede usar simplemente como:

 p + scale_x_continuous(trans=reverselog_trans(10)) 

que da la ttwig:

enter image description here

Usar un conjunto de datos ligeramente diferente para mostrar que el eje definitivamente se invierte:

 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