Quel langage de formatage utilise ggtext pour formater le texte?

Aug 19 2020

J'essaye d'afficher la notation scientifique sur un axe ggplot2 en gras, avec le format littéral "Ax10 ^ B", pas le format "AeB" qui est le format par défaut de ggplot2. Lorsque ce code est exécuté

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


voici le résultat:

J'utilise element_markdown()from ggtextcar il permet de transférer le visage en gras comme je l'ai découvert ici: Comment faire pour que les formats de texte personnalisés ggplot2 à partir des fonctions d'échelle d'axe suivent les spécifications de format définies dans theme ()?

Je peux corriger les guillemets en changeant '\\1'en \\1(en supprimant les guillemets simples). Mais j'ai du mal à afficher le signe de multiplication. Je pourrais simplement utiliser une minuscule xmais c'est paresseux.

Quand j'essaye d'utiliser $\times$comme suggéré icihttps://rstudio-pubs-static.s3.amazonaws.com/18858_0c289c260a574ea08c0f10b944abc883.htmlJ'obtiens une erreur. Une vignette pour ggtextsemble utiliser html:https://cran.r-project.org/web/packages/ggtext/vignettes/theme_elements.htmlmais ils utilisent des <sup>balises qui semblent aller à l'encontre de l'utilisation de ^pour créer un exposant ici, et les balises ne fonctionnent pas lorsque je les utilise, et toutes les ressources pour "signe de multiplication en html" que j'ai recherchées n'ont pas donné de solution . Ma question est donc la suivante: où puis-je trouver une bonne ressource pour apprendre le langage de mise en forme approprié ggtext/ ggplot2utilise pour les étiquettes de graduation des axes? Voudrais également connaître la solution aux problèmes spécifiques que je rencontre.

Réponses

1 ClausWilke Aug 20 2020 at 14:32

{ggtext} utilise Markdown / HTML. Vous pouvez insérer des caractères spéciaux en utilisant simplement des caractères Unicode ou en utilisant des entités HTML. Ici, vous voulez probablement &times;.

De plus, n'analysez pas les chaînes en expressions lorsque vous travaillez avec {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")) 

Créé le 2020-08-20 par le package reprex (v0.3.0)

user12728748 Aug 20 2020 at 05:29

Voici une version avec juste des plotmathexpressions:

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

... et voici une version avec 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"))

Créé le 2020-08-20 par le package reprex (v0.3.0)