scales scale_y_continuous scale_x_discrete rotate ggplot breaks r ggplot2

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



scales ggplot2 (1)

Me gustaría hacer un diagrama 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()

p + scale_x_reverse()

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 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 trama:

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))