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