Какой язык форматирования использует ggtext для форматирования текста?

Aug 19 2020

Я пытаюсь отобразить научную нотацию на оси ggplot2 жирным шрифтом в буквальном формате «Ax10 ^ B», а не в формате «AeB», который используется по умолчанию для ggplot2. Когда этот код запускается

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


вот результат:

Я использую element_markdown()from, ggtextпотому что он позволяет переносить жирное начертание, как я обнаружил здесь: Как сделать так, чтобы пользовательские текстовые форматы ggplot2 из функций масштабирования оси соответствовали спецификациям формата, установленным в theme ()?

Я могу исправить двойные кавычки, изменив '\\1'на \\1(удалив одинарные кавычки). Но у меня возникают проблемы с отображением знака умножения. Я мог бы просто использовать строчные буквы, xно это лениво.

Когда я пытаюсь использовать, $\times$как предлагается здесьhttps://rstudio-pubs-static.s3.amazonaws.com/18858_0c289c260a574ea08c0f10b944abc883.htmlЯ получаю ошибку Виньетка, ggtextпохоже, использует html:https://cran.r-project.org/web/packages/ggtext/vignettes/theme_elements.htmlно они используют <sup>теги, которые, кажется, противоречат использованию здесь ^для создания экспоненты, и теги не работают, когда я их использую, и все ресурсы для "знака умножения в html", которые я искал, не дали решения . Итак, мой вопрос: где я могу найти хороший ресурс для изучения правильного языка форматирования, который ggtext/ ggplot2использует для меток осей? Также хотел бы знать решение конкретных проблем, которые у меня есть.

Ответы

1 ClausWilke Aug 20 2020 at 14:32

{ggtext} использует Markdown / HTML. Вы можете вставлять специальные символы, просто используя символы Unicode или используя объекты HTML. Вот тебе наверняка захочется &times;.

Кроме того, не разбирайте строки в выражения при работе с {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")) 

Создано 20.08.2020 пакетом REPEX (v0.3.0)

user12728748 Aug 20 2020 at 05:29

Вот версия с простыми plotmathвыражениями:

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

... а вот версия с 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"))

Создано 20.08.2020 пакетом REPEX (v0.3.0)