Bahasa pemformatan apa yang digunakan ggtext untuk memformat teks?

Aug 19 2020

Saya mencoba menampilkan notasi ilmiah pada sumbu ggplot2 dengan huruf tebal, dengan format "Ax10 ^ B" literal, bukan format "AeB" yang merupakan default dari ggplot2. Saat kode ini dijalankan

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


ini hasilnya:

Saya menggunakan element_markdown()from ggtextkarena memungkinkan wajah tebal untuk ditransfer seperti yang saya temukan di sini: Bagaimana cara membuat format teks kustom ggplot2 dari fungsi skala sumbu mengikuti spesifikasi format yang ditetapkan dalam theme ()?

Saya bisa memperbaiki tanda kutip ganda dengan mengubah '\\1'ke \\1(menghapus tanda kutip tunggal). Tapi saya kesulitan menampilkan tanda perkalian. Saya bisa saja menggunakan huruf kecil xtapi itu malas.

Ketika saya mencoba menggunakan $\times$seperti yang disarankan di sinihttps://rstudio-pubs-static.s3.amazonaws.com/18858_0c289c260a574ea08c0f10b944abc883.htmlSaya mendapatkan kesalahan. Vinyet untuk ggtextsepertinya menggunakan html:https://cran.r-project.org/web/packages/ggtext/vignettes/theme_elements.htmltetapi mereka menggunakan <sup>tag yang tampaknya bertentangan dengan penggunaan ^untuk membuat eksponen di sini, dan tag tidak berfungsi saat saya menggunakannya, dan semua sumber daya untuk "perkalian masuk html" yang saya telusuri belum menghasilkan solusi . Jadi pertanyaan saya adalah: Di mana saya dapat menemukan sumber yang baik untuk mempelajari bahasa pemformatan yang tepat yang ggtext/ ggplot2digunakan untuk label centang sumbu? Saya juga ingin mengetahui solusi untuk masalah spesifik yang saya alami.

Jawaban

1 ClausWilke Aug 20 2020 at 14:32

{ggtext} menggunakan Markdown / HTML. Anda dapat memasukkan karakter khusus baik dengan hanya menggunakan karakter unicode atau dengan menggunakan entitas HTML. Di sini, Anda mungkin ingin &times;.

Selain itu, jangan mengurai string menjadi ekspresi saat bekerja dengan {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")) 

Dibuat pada 2020-08-20 oleh paket reprex (v0.3.0)

user12728748 Aug 20 2020 at 05:29

Ini adalah versi hanya dengan plotmathekspresi:

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

... dan ini adalah versi dengan 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"))

Dibuat pada 2020-08-20 oleh paket reprex (v0.3.0)