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

Я пытаюсь отобразить научную нотацию на оси 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() из 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использует для меток оси? Также хотел бы знать решение конкретных проблем, которые у меня есть.

2 ответа

Решение

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

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

Другие вопросы по тегам