¿Qué idioma de formato utiliza ggtext para formatear el texto?
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 ggtext
porque 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, x
pero 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 ggtext
parece 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
/ ggplot2
usa 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
{ggtext} usa Markdown / HTML. Puede insertar caracteres especiales simplemente usando caracteres Unicode o usando entidades HTML. Aquí, probablemente quieras ×
.
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", "×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)
Aquí hay una versión con solo plotmath
expresiones:
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)