Forzar a R para que deje de trazar etiquetas de eje abreviadas, por ejemplo, 1e + 00 en ggplot2

111

En ggplot2, ¿cómo puedo evitar que las etiquetas de los ejes se abrevian, por ejemplo, a lo 1e+00, 1e+01largo del eje x una vez trazadas? Idealmente, quiero forzar a R para que muestre los valores reales que en este caso serían 1,10.

Cualquier ayuda muy apreciada.

JPD
fuente

Respuestas:

134

Creo que estás buscando esto:

require(ggplot2)
df <- data.frame(x=seq(1, 1e9, length.out=100), y=sample(100))
# displays x-axis in scientific notation
p  <- ggplot(data = df, aes(x=x, y=y)) + geom_line() + geom_point()
p

# displays as you require
require(scales)
p + scale_x_continuous(labels = comma)
Arun
fuente
2
Esto funcionó. Gracias. Por interés, ¿qué otras opciones de 'etiqueta' hay para los ejes en ggplot2 con el paquete de escalas?
JPD
3
Visite también esta página de ggplot2.org , fue muy útil para mí con un problema similar.
Marta Karas
64

Intentaste algo como:

options(scipen=10000)

antes de trazar?

juba
fuente
3
Esto funciona estableciendo una penalización más alta por decidir utilizar la notación científica. Más explicación en esta respuesta: stackoverflow.com/a/18600721/1080804
ecoe
35

Solo una actualización de lo que hizo @Arun, ya que lo probé hoy y no funcionó porque se actualizó para

+ scale_x_continuous(labels = scales::comma)
Derek Corcoran
fuente
2
La respuesta de @ Arun debería funcionar bien tal como está, tal vez se olvidó de incluir el require(scales)? Esto importa el paquete que contiene la commabáscula. Como ha descubierto, también puede especificar el paquete al referirse a él en lugar de solicitarlo de antemano.
cincodenada
17

Como solución más general, puede utilizar scales::format_formatpara eliminar la notación científica. Esto también le brinda mucho control sobre cómo desea que se muestren exactamente sus etiquetas, en contraposición a lo scales::commaque solo hace las separaciones por comas de los órdenes de magnitud.

Por ejemplo:

require(ggplot2)
require(scales)
df <- data.frame(x=seq(1, 1e9, length.out=100), y=sample(100))

# Here we define spaces as the big separator
point <- format_format(big.mark = " ", decimal.mark = ",", scientific = FALSE)

# Plot it
p  <- ggplot(data = df, aes(x=x, y=y)) + geom_line() + geom_point()
p + scale_x_continuous(labels = point)
usuario2739472
fuente
8

Existe una solución que no requiere biblioteca de escalas.

Puedes probar:

# To deactivate scientific notation on y-axis:

    p + scale_y_continuous(labels = function(x) format(x, scientific = FALSE))

# To activate scientific notation on y-axis:

    p + scale_y_continuous(labels = function(x) format(x, scientific = TRUE))

# To deactivate scientific notation on x-axis:

    p + scale_x_continuous(labels = function(x) format(x, scientific = FALSE))

# To activate scientific notation on x-axis:

    p + scale_x_continuous(labels = function(x) format(x, scientific = TRUE))
Willian Adamczyk
fuente
2

¿No es la solución general más simple establecer la penalización que usa R para la notación científica más alta?

es decir, establezca scipen()un número con el que se sienta cómodo.

Por ejemplo, si es probable que el máximo de su eje en los gráficos sea 100 000, la configuración scipen(200000)garantizará que R (y ggplot) utilizarán la notación estándar para todos los números por debajo de 200000 y no habrá ningún requisito para agregar líneas a la función ggplot.

Andrew Fraser
fuente
0

Extender la pregunta original para que también comprenda fracciones, es decir, 1, 0.1, 0.01, 0.001, etc. y evitar ceros finales

p + scale_x_continuous(labels = function(x) sprintf("%g", x))
mdeleeuw
fuente