¿Cómo puedo formatear tags de eje con exponentes con ggplot2 y escalas?

Con la nueva versión ggplot2 y las escalas, no puedo entender cómo obtener la etiqueta del eje en notación científica. Por ejemplo:

x <- 1:4 y <- c(0, 0.0001, 0.0002, 0.0003) dd <- data.frame(x, y) ggplot(dd, aes(x, y)) + geom_point() 

me da

Ejemplo ggplot con escalas

Me gustaría que las tags de los ejes fueran 0, 5 x 10 ^ -5, 1 x 10 ^ -4, 1.5 x 10 ^ -4, etc. No puedo deducir la combinación correcta de scale_y_continuous() y math_format() (al menos creo que eso es lo que necesito).

scale_y_log10() log transforma el eje, que no quiero. scale_y_continuous(label = math_format()) me da 10 ^ 0, 10 ^ 5e-5, etc. Veo por qué este último da ese resultado, pero no es lo que estoy buscando.

Estoy usando ggplot2_0.9.1 y scales_0.2.1

Adapte la respuesta de Brian y creo que obtuve lo que buscas.

Simplemente agregando un parse () a la función scientific_10 () (y cambiando ‘x’ al símbolo ‘times’ correcto), terminas con esto:

 x <- 1:4 y <- c(0, 0.0001, 0.0002, 0.0003) dd <- data.frame(x, y) scientific_10 <- function(x) { parse(text=gsub("e", " %*% 10^", scales::scientific_format()(x))) } ggplot(dd, aes(x, y)) + geom_point()+scale_y_continuous(label=scientific_10) 

enter image description here

Es posible que aún desee mejorar la función, por lo que trata con 0 un poco más elegantemente, ¡pero creo que eso es todo!

Según los comentarios sobre la solución aceptada, OP está buscando formatear exponentes como exponentes. Esto se puede hacer con las funciones trans_format y trans_breaks en el paquete de escalas :

  library(ggplot2) library(scales) x <- 1:4 y <- c(0, 0.0001, 0.0002, 0.0003) dd <- data.frame(x, y) ggplot(dd, aes(x, y)) + geom_point() + scale_y_log10("y", breaks = trans_breaks("log10", function(x) 10^x), labels = trans_format("log10", math_format(10^.x))) 

enter image description here

 scale_y_continuous(label=scientific_format()) 

da tags con e en lugar de 10:

enter image description here

Supongo que si realmente quieres 10, podrías envolverlo en otra función.

 scientific_10 <- function(x) { gsub("e", " x 10^", scientific_format()(x)) } ggplot(dd, aes(x, y)) + geom_point() + scale_y_continuous(label=scientific_10) 

enter image description here

Escribí una versión de scientific_10 que evita el paquete de escalas; también elimina ceros a la izquierda en exponentes (10 ^ 04 a 10 ^ 4, etc.). Esto fue adaptado de las respuestas útiles dadas arriba.

También he incluido funciones de escala de envoltura a continuación.

 scientific_10 <- function(x) { xout <- gsub("1e", "10^{", format(x),fixed=TRUE) xout <- gsub("{-0", "{-", xout,fixed=TRUE) xout <- gsub("{+", "{", xout,fixed=TRUE) xout <- gsub("{0", "{", xout,fixed=TRUE) xout <- paste(xout,"}",sep="") return(parse(text=xout)) } scale_x_log10nice <- function(name=NULL,omag=seq(-10,20),...) { breaks10 <- 10^omag scale_x_log10(name,breaks=breaks10,labels=scientific_10(breaks10),...) } scale_y_log10nice <- function(name=NULL,omag=seq(-10,20),...) { breaks10 <- 10^omag scale_y_log10(name,breaks=breaks10,labels=scientific_10(breaks10),...) } scale_loglog <- function(...) { list(scale_x_log10nice(...),scale_y_log10nice(...)) } qplot(x=exp(5*rnorm(100)),geom="density",kernel="rectangular") + scale_x_log10nice() 

Riffing de la respuesta de Tom anterior, lo siguiente elimina + signos, y maneja 0 mejor (la función también está anónimamente anónima):

 scale_y_continuous(label= function(x) {ifelse(x==0, "0", parse(text=gsub("[+]", "", gsub("e", " %*% 10^", scientific_format()(x)))))} ) +