¿Cómo hago para que los formatos de texto personalizados de ggplot2 a partir de las funciones de escala del eje sigan las especificaciones de formato establecidas en theme ()?

Aug 18 2020

Quiero cambiar la notación científica en los ejes ggplot2 de un formato como 3.23e+6a 3.23 × 10^6. Afortunadamente, esta pregunta ha sido respondida aquí: ¿Cómo cambio el formato de los números en un eje con ggplot?

Funciona bien para casos básicos. Sin embargo, no funciona cuando desea cambiar el formato de la etiqueta del eje. Esto se ilustra con este ejemplo:

library(tidyverse)
ggplot(mpg, aes(displ, hwy*10^9)) + geom_point()

#makes the scientific notation using "AeB" explicitly write out Ax10^B
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)
}


ggplot(mpg, aes(displ, hwy*10^9)) + 
  theme_classic() +
  geom_point() + 
  scale_y_continuous(labels= fancy_scientific)  +
 theme(text = element_text(face = "bold")) 


Cuyos rendimientos:

El problema es que el texto del eje Y no está en negrita como se especifica en la llamada a theme. Cuando utilizo browserpara ver lo que está sucediendo dentro de fancy_scientific, veo que devuelve un objeto de clase "expresión" que en este caso se imprime como expression('2'%*%10^+01, '3'%*%10^+01, '4'%*%10^+01)mientras que la función scales::scientific, que se puede usar para forzar la notación científica del tipo que quiero evitar pero se ajusta a cualquier especificación de tema que establezca, devuelve un vector de cadenas directamente. Cuando modifico fancy_scientificpara devolver un vector de cadenas como '2'%*%10^+01si estuvieran directamente representadas en el eje Y mostrado.

Entonces, la pregunta es ¿cómo hago para que la salida de la fancy_scientificfunción se ajuste a la especificación de mi tema?

Respuestas

JordanMandel Aug 20 2020 at 02:54

Una forma de hacer esto, como sugiere el comentario, es el ggtextpaquete.

library(tidyverse)
library(ggtext)
ggplot(mpg, aes(displ, hwy*10^9)) + geom_point()


#makes the scientific notation using "AeB" explicitly write out Ax10^B
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)
}


ggplot(mpg, aes(displ, hwy*10^9)) + 
  theme_classic() +
  geom_point() + 
  scale_y_continuous(labels= fancy_scientific)  +
  theme(text = element_text(face = "bold"), 
        axis.text.y = element_markdown(face = "bold")) 

Sin embargo, si ejecuta este código, notará algunos problemas. Hay comillas alrededor del número inicial, que se pueden eliminar eliminando las comillas simples en l <- gsub("^(.*)e", "'\\1'e", l). Recibo un error cuando especifico textcomo element_markdown()porque aparentemente hay algunos valores predeterminados que deben configurarse para otras partes del texto. Así que tengo que establecer específicamente axis.text.ycomo element_markdown. Esto deja el problema de obtener un signo de tiempo real para mostrar. Haré una pregunta de seguimiento sobre esto porque he respondido la pregunta de cómo hacer que se aplique el formato en negrita, aunque también tengo curiosidad sobre cómo configurar los valores predeterminados element_markdowncorrectamente para poder usarlos para especificar en textlugar de axis.text.y.