scales scale_y_continuous scale_x_discrete scale_x_continuous ggplot breaks r ggplot2 boxplot scaletransform

scale_y_continuous - Transforme solo un eje a la escala log10 con ggplot2



scale_y_continuous labels comma (4)

Creo que finalmente lo conseguí haciendo algunas transformaciones manuales con los datos antes de la visualización:

d <- diamonds # computing logarithm of prices d$price <- log10(d$price)

Y elabore un formateador para luego calcular ''retroceder'' los datos logarítmicos:

formatBack <- function(x) 10^x # or with special formatter (here: "dollar") formatBack <- function(x) paste(round(10^x, 2), "$", sep='' '')

Y dibuja la trama con el formateador dado:

m <- ggplot(d, aes(y = price, x = color)) m + geom_boxplot() + scale_y_continuous(formatter=''formatBack'')

¡Perdón a la comunidad por molestarte con una pregunta que podría haber resuelto antes! Lo gracioso es que estuve trabajando duro para hacer que este plan funcionara hace un mes, pero no funcionó. Después de preguntar aquí, lo tengo.

De todos modos, ¡gracias a @DWin por la motivación!

Tengo el siguiente problema: me gustaría visualizar una variable discreta y una variable continua en un diagrama de caja en el que este último tiene algunos valores extremadamente altos. Esto hace que el diagrama de caja no tenga sentido (los puntos e incluso el "cuerpo" de la tabla son demasiado pequeños), es por eso que me gustaría mostrar esto en una escala log10. Soy consciente de que podría omitir los valores extremos de la visualización, pero no estoy destinado a hacerlo.

Veamos un ejemplo simple con datos de diamantes:

m <- ggplot(diamonds, aes(y = price, x = color))

El problema no es grave aquí, pero espero que puedas imaginar por qué me gustaría ver los valores en una escala log10. Vamos a intentarlo:

m + geom_boxplot() + coord_trans(y = "log10")

Como puede ver, el eje y está log10 escalado y se ve bien, pero hay un problema con el eje x, lo que hace que la trama sea muy extraña.

El problema no ocurre con scale_log , pero esta no es una opción para mí , ya que no puedo usar un formateador personalizado de esta manera. P.ej:

m + geom_boxplot() + scale_y_log10()

Mi pregunta: ¿Alguien sabe una solución para trazar el diagrama de caja con la escala log10 en el eje Y cuyas etiquetas podrían formatearse libremente con una función de formatter como en este thread ?

Editando la pregunta para ayudar a los contestadores basados ​​en respuestas y comentarios:

Lo que realmente estoy buscando: un log10 eje transformado (y) sin etiquetas científicas. Me gustaría etiquetarlo como dólar (formatter=dollar) o cualquier formato personalizado.

Si intento la sugerencia de @daley, recibo las siguientes advertencias:

> m + geom_boxplot() + scale_y_log10(formatter=dollar) Warning messages: 1: In max(x) : no non-missing arguments to max; returning -Inf 2: In max(x) : no non-missing arguments to max; returning -Inf 3: In max(x) : no non-missing arguments to max; returning -Inf

Con una etiqueta de eje y sin cambios:


Lo más simple es simplemente dar al argumento del formateador el nombre de la función de registro:

m + geom_boxplot() + scale_y_continuous(formatter=''log10'')

EDITAR: O si no te gusta, entonces cualquiera de estos parece dar el mismo resultado:

m <- ggplot(diamonds, aes(y = price, x = color), log="y"); m + geom_boxplot() m <- ggplot(diamonds, aes(y = price, x = color), log10="y"); m + geom_boxplot()

EDIT2 y 3: Experimentos adicionales (después de descartar el que intentó colocar con éxito los signos "$" frente a los valores registrados):

fmtExpLg10 <- function(x) paste(round_any(10^x/1000, 0.01) , "K $", sep="") ggplot(diamonds, aes(color, log10(price))) + geom_boxplot() + scale_y_continuous("Price, log10-scaling", formatter = fmtExpLg10)

Nota agregada a mediados de 2017 en comentario sobre el cambio de sintaxis del paquete:

scale_y_continuous (formatter = ''log10'') ahora es scale_y_continuous (trans = ''log10'') (ggplot2 v2.2.1)


Otra solución que usa scale_y_log10 con trans_breaks , trans_format y annotation_logticks()

library(ggplot2) m <- ggplot(diamonds, aes(y = price, x = color)) m + geom_boxplot() + scale_y_log10( breaks = scales::trans_breaks("log10", function(x) 10^x), labels = scales::trans_format("log10", scales::math_format(10^.x)) ) + theme_bw() + annotation_logticks()

Creado en 2018-08-08 por el paquete reprex (v0.2.0.9000).


Tuve un problema similar y esta escala funcionó para mí como un encanto:

breaks = 10**(1:10) scale_y_log10(breaks = breaks, labels = comma(breaks))

como también desea los niveles intermedios (10 ^ 3.5), debe modificar el formato:

breaks = 10**(1:10 * 0.5) m <- ggplot(diamonds, aes(y = price, x = color)) + geom_boxplot() m + scale_y_log10(breaks = breaks, labels = comma(breaks, digits = 1))

Después de ejecutar ::