¿Qué idioma de formato utiliza ggtext para formatear el texto?

Aug 19 2020

Estoy tratando de mostrar la notación científica en un eje ggplot2 en negrita, con el formato literal "Ax10 ^ B", no el formato "AeB" que es el predeterminado de ggplot2. Cuando se ejecuta este código

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")) 


este es el resultado:

Utilizo element_markdown()from ggtextporque permite que la cara en negrita se transfiera como descubrí aquí: ¿Cómo hago para que los formatos de texto personalizados de ggplot2 de las funciones de escala de eje sigan las especificaciones de formato establecidas en theme ()?

Puedo arreglar las comillas dobles cambiando '\\1'a \\1(eliminando las comillas simples). Pero tengo problemas para mostrar el signo de multiplicación. Podría usar minúsculas, xpero eso es flojo.

Cuando trato de usar $\times$como se sugiere aquíhttps://rstudio-pubs-static.s3.amazonaws.com/18858_0c289c260a574ea08c0f10b944abc883.htmlMe sale un error. Una viñeta para ggtextparece usar html:https://cran.r-project.org/web/packages/ggtext/vignettes/theme_elements.htmlpero usan <sup>etiquetas que parecen ir en contra del uso de ^para hacer un exponente aquí, y las etiquetas no funcionan cuando las uso, y todos los recursos para "signo de multiplicación en html" que busqué no han dado una solución . Entonces, mi pregunta es: ¿Dónde puedo encontrar un buen recurso para aprender el lenguaje de formato adecuado que ggtext/ ggplot2usa para las etiquetas de marca de eje? También me gustaría saber la solución a los problemas específicos que estoy teniendo.

Respuestas

1 ClausWilke Aug 20 2020 at 14:32

{ggtext} usa Markdown / HTML. Puede insertar caracteres especiales simplemente usando caracteres Unicode o usando entidades HTML. Aquí, probablemente quieras &times;.

Además, no analice cadenas en expresiones cuando trabaje con {ggtext}.

library(tidyverse)
library(ggtext)

#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", "\\1e", l)
  # turn the 'e+' into plotmath format
  l <- gsub("e", "&times;10^", l)
  # return this as a string
  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")) 

Creado el 20-08-2020 por el paquete reprex (v0.3.0)

user12728748 Aug 20 2020 at 05:29

Aquí hay una versión con solo plotmathexpresiones:

library(dplyr)
library(ggplot2)

fancy_scientific <- function(l) {
    l <- format(l, scientific = TRUE)
    parse(text=gsub("(.*)e(\\+?)(\\-?[0-9]+)", 
        "bold('\\1') * bold(' * ') * bold('10')^bold('\\3')", l))
}

mpg %>% dplyr::mutate(hwy = hwy * 1e9) %>% 
    ggplot(aes(displ, hwy)) + 
    theme_classic() +
    geom_point() + 
    scale_y_continuous(labels= fancy_scientific) +
    theme(text = element_text(face = "bold"))

... y aquí hay una versión con ggtext:

library(dplyr)
library(ggplot2)
library(ggtext)

fancy_scientific <- function(l) {
    l <- format(l, scientific = TRUE)
    parse(text=gsub("(.*)e(\\+?)(\\-?[0-9]+)", "\\1 * 10^(\\3)", l))

    ## this would also work, instead of the line above:
    # gsub("(.*)e(\\+?)(\\-?[0-9]+)", "**\\1 \\* 10<sup>\\3</sup>**", l)
}

mpg %>% dplyr::mutate(hwy = hwy * 1e9) %>% 
    ggplot(aes(displ, hwy)) + 
    theme_classic() +
    geom_point() + 
    scale_y_continuous(labels= fancy_scientific)  +
    theme(text = element_text(face = "bold"), 
          axis.text.y = element_markdown(face = "bold"))

Creado el 20-08-2020 por el paquete reprex (v0.3.0)