¿Cómo cambio el formato de los números en un eje con ggplot?

131

Estoy usando R y ggplot para dibujar un diagrama de dispersión de algunos datos, todo está bien, excepto que los números en el eje y salen con formato de exponente de estilo de computadora, es decir, 4e + 05, 5e + 05, etc. Esto es obviamente inaceptable, así que quiero que se muestre como 500,000, 400,000, y así sucesivamente. Obtener una notación de exponente adecuada también sería aceptable.

El código para la trama es el siguiente:

p <- ggplot(valids, aes(x=Test, y=Values)) +
  geom_point(position="jitter") +
  facet_grid(. ~ Facet) +
  scale_y_continuous(name="Fluorescent intensity/arbitrary units") +
  scale_x_discrete(name="Test repeat") +
  stat_summary(fun.ymin=median, fun.ymax=median, fun.y=median, geom="crossbar")

Cualquier ayuda muy apreciada.

Jack Aidley
fuente
30
Tenga cuidado de describir las ggplotopciones predeterminadas como "obviamente inaceptables". Quiere decir que tiene una preferencia personal por un formato diferente. Un número en el formato 4e+05es notación científica, y sería el formato preferido en una amplia variedad de aplicaciones.
Andrie
53
4e + 05 no es notación científica, es una aproximación de computadora a la notación científica. No sería aceptable en ninguna revista impresa en la que pueda pensar, por lo que considero inaceptable para mi disertación.
Jack Aidley

Respuestas:

126

Otra opción es formatear las etiquetas de marca de eje con comas mediante el uso del paquete scalesy agregar

 scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = comma)

a su declaración ggplot.

Si no desea cargar el paquete, use:

scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = scales::comma)
Jim M.
fuente
9
Es sorprendente que un problema tan trivial requiera cargar un nuevo paquete.
luchonacho
Para su información, esto también funciona con scale_y_log10 (etiquetas = escalas :: coma), y estoy asumiendo otras escalas en ggplot2. Grandes consejos!
TheProletariat
66

También encontré otra forma de hacer esto que da la notación adecuada 'x10 (superíndice) 5' en los ejes. Lo estoy publicando aquí con la esperanza de que pueda ser útil para algunos. Obtuve el código de aquí, así que no reclamo ningún crédito por eso, que con razón va a Brian Diggs.

fancy_scientific <- function(l) {
     # turn in to character string in scientific notation
     l <- format(l, scientific = TRUE)
     # quote the part before the exponent to keep all the digits
     l <- gsub("^(.*)e", "'\\1'e", l)
     # turn the 'e+' into plotmath format
     l <- gsub("e", "%*%10^", l)
     # return this as an expression
     parse(text=l)
}

Que luego puedes usar como

ggplot(data=df, aes(x=x, y=y)) +
   geom_point() +
   scale_y_continuous(labels=fancy_scientific) 
Jack Aidley
fuente
10
Si no desea que se imprima 0 como "0 x 10⁺⁰", agregue lo siguiente debajo de la format(...)línea:l <- gsub("0e\\+00","0",l)
semi-extrínseco
1
Si desea hacer un caso especial para otras cosas, es más fácil agregar más gsub()directamente después de format(), mientras prueba lo que format()regresa para su caso en una consola separada.
semi-extrínseco
3
agregue esto antes del último gsubcomando: # remove + after exponent, if exists. E.g.: (3x10^+2 -> 3x10^2) l <- gsub("e\\+","e",l)y después de él: # convert 1x10^ or 1.000x10^ -> 10^ l <- gsub("\\'1[\\.0]*\\'\\%\\*\\%", "", l)para hacerlo en formato que generalmente se usa en documentos.
John_West
44
x <- rnorm(10) * 100000
y <- seq(0, 1, length = 10)
p <- qplot(x, y)
library(scales)
p + scale_x_continuous(labels = comma)
Círculo discreto
fuente
Cuando intento esto me sale un error que formateador es un argumento no utilizado? ¿Necesita otro paquete o algo?
Jack Aidley
44
Cambié el código para incluir library(scales)y usar el commaque debería funcionar mejor que la función que tenía antes.
DiscreteCircle
16

Llego tarde al juego aquí, pero en caso de que otros quieran una solución fácil, creé un conjunto de funciones que se pueden llamar así:

 ggplot + scale_x_continuous(labels = human_gbp)

que le dan números legibles por humanos para los ejes x o y (o cualquier número en general realmente).

Puede encontrar las funciones aquí: Github Repo Simplemente copie las funciones en su script para que pueda llamarlas.

Feargal Ryan
fuente
10

Encuentro que la respuesta sugerida de Jack Aidley es útil.

Quería tirar otra opción. Supongamos que tiene una serie con muchos números pequeños y desea asegurarse de que las etiquetas del eje escriban el punto decimal completo (por ejemplo, 5e-05 -> 0.0005), luego:

NotFancy <- function(l) {
 l <- format(l, scientific = FALSE)
 parse(text=l)
}

ggplot(data = data.frame(x = 1:100, 
                         y = seq(from=0.00005,to = 0.0000000000001,length.out=100) + runif(n=100,-0.0000005,0.0000005)), 
       aes(x=x, y=y)) +
     geom_point() +
     scale_y_continuous(labels=NotFancy) 
EconomiCurtis
fuente
23
Esto puede acortarse mediante el uso de una función anónima: por scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})qué no hay un formateador predefinido como ese, el infierno lo sabe.
eMPee584