¿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 ()?
Quiero cambiar la notación científica en los ejes ggplot2 de un formato como 3.23e+6
a 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 browser
para 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_scientific
para devolver un vector de cadenas como '2'%*%10^+01
si estuvieran directamente representadas en el eje Y mostrado.
Entonces, la pregunta es ¿cómo hago para que la salida de la fancy_scientific
función se ajuste a la especificación de mi tema?
Respuestas
Una forma de hacer esto, como sugiere el comentario, es el ggtext
paquete.
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 text
como 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.y
como 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_markdown
correctamente para poder usarlos para especificar en text
lugar de axis.text.y
.