Bagaimana cara membuat format teks kustom ggplot2 dari fungsi skala sumbu mengikuti spesifikasi format yang ditetapkan dalam theme ()?

Aug 18 2020

Saya ingin mengubah notasi ilmiah pada sumbu ggplot2 dari format seperti 3.23e+6menjadi 3.23 × 10^6. Untungnya pertanyaan ini telah terjawab di sini: Bagaimana cara mengubah format angka pada sumbu dengan ggplot?

Ini bekerja dengan baik untuk kasus dasar. Namun, ini tidak berfungsi saat Anda ingin mengubah pemformatan label sumbu. Ini diilustrasikan oleh contoh ini:

library(tidyverse)
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")) 


Hasil yang mana:

Masalahnya adalah teks sumbu Y tidak tebal seperti yang ditentukan dalam panggilan ke theme. Ketika saya menggunakan browseruntuk melihat apa yang terjadi di dalam fancy_scientificsaya melihat bahwa ia mengembalikan objek kelas "ekspresi" yang dalam hal ini dicetak sebagai expression('2'%*%10^+01, '3'%*%10^+01, '4'%*%10^+01)fungsi sementara scales::scientific, yang dapat digunakan untuk memaksa notasi ilmiah dari jenis yang ingin saya hindari tetapi sesuai ke spesifikasi tema apa pun yang saya tetapkan, mengembalikan vektor string secara langsung. Ketika saya memodifikasi fancy_scientificuntuk mengembalikan vektor string seperti '2'%*%10^+01mereka secara langsung diberikan ke sumbu Y yang ditampilkan.

Jadi pertanyaannya adalah bagaimana cara membuat keluaran dari fancy_scientificfungsi tersebut sesuai dengan spesifikasi tema saya?

Jawaban

JordanMandel Aug 20 2020 at 02:54

Cara untuk melakukan ini, seperti yang disarankan oleh komentar adalah ggtextpaketnya.

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

Jika Anda menjalankan kode ini, Anda akan melihat beberapa masalah. Ada tanda kutip di sekitar nomor depan, yang dapat dihapus dengan menghapus tanda kutip tunggal di l <- gsub("^(.*)e", "'\\1'e", l). Saya mendapatkan kesalahan ketika saya tentukan textsebagai element_markdown()karena ternyata ada beberapa default yang perlu diatur untuk bagian lain dari teks. Jadi saya harus secara khusus mengatur axis.text.ysebagai element_markdown. Ini meninggalkan masalah mendapatkan tanda waktu nyata untuk ditampilkan. Saya akan mengajukan pertanyaan lanjutan tentang hal ini karena saya telah menjawab pertanyaan tentang cara menerapkan format tebal, meskipun saya juga ingin tahu tentang cara menyetel default ke element_markdowndengan benar sehingga saya dapat menggunakannya untuk menentukan textdaripada axis.text.y.