ฉันจะสร้างรูปแบบข้อความที่กำหนดเองของ ggplot2 จากฟังก์ชันมาตราส่วนแกนตามข้อกำหนดรูปแบบที่ตั้งไว้ในธีม () ได้อย่างไร

Aug 18 2020

ฉันต้องการเปลี่ยนสัญกรณ์ทางวิทยาศาสตร์เกี่ยวกับแกน ggplot2 จากรูปแบบเช่นการ3.23e+6 3.23 × 10^6ขอบคุณคำถามนี้ได้รับคำตอบที่นี่: ฉันจะเปลี่ยนการจัดรูปแบบของตัวเลขบนแกนด้วย ggplot ได้อย่างไร

ใช้ได้ดีสำหรับกรณีพื้นฐาน อย่างไรก็ตามจะใช้ไม่ได้เมื่อคุณต้องการเปลี่ยนการจัดรูปแบบของป้ายชื่อแกน ตัวอย่างนี้แสดงให้เห็น:

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


ซึ่งให้ผลตอบแทน:

ปัญหาคือว่าข้อความที่แกน Y themeไม่ได้เป็นตัวหนาตามที่ระบุในการเรียกร้องให้ เมื่อฉันใช้browserเพื่อดูสิ่งที่เกิดขึ้นภายในfancy_scientificฉันเห็นว่ามันส่งคืนอ็อบเจ็กต์ของคลาส "นิพจน์" ซึ่งในกรณีนี้จะถูกพิมพ์ในexpression('2'%*%10^+01, '3'%*%10^+01, '4'%*%10^+01)ขณะที่ฟังก์ชันscales::scientificซึ่งสามารถใช้บังคับสัญกรณ์ทางวิทยาศาสตร์ประเภทที่ฉันต้องการหลีกเลี่ยง แต่สอดคล้อง ตามข้อกำหนดของธีมที่ฉันตั้งไว้ส่งกลับเวกเตอร์ของสตริงโดยตรง เมื่อฉันแก้ไขfancy_scientificเพื่อส่งคืนเวกเตอร์ของสตริงเหมือนกับ'2'%*%10^+01ที่แสดงผลโดยตรงไปยังแกน Y ที่แสดง

คำถามคือฉันจะทำให้เอาต์พุตของfancy_scientificฟังก์ชันเป็นไปตามข้อกำหนดธีมของฉันได้อย่างไร?

คำตอบ

JordanMandel Aug 20 2020 at 02:54

วิธีทำตามที่คอมเม้นแนะนำคือggtextแพคเกจ

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

หากคุณเรียกใช้รหัสนี้คุณจะสังเกตเห็นปัญหาบางอย่าง l <- gsub("^(.*)e", "'\\1'e", l)มีคำพูดรอบจำนวนชั้นนำซึ่งสามารถอากาศกำจัดโดยการลบคำพูดเดียวในเป็น ฉันได้รับข้อผิดพลาดเมื่อระบุว่าtextเป็นelement_markdown()เพราะเห็นได้ชัดว่ามีค่าเริ่มต้นบางอย่างที่ต้องตั้งค่าสำหรับส่วนอื่น ๆ ของข้อความ ดังนั้นผมจึงมีการตั้งค่าเฉพาะเป็นaxis.text.y element_markdownซึ่งจะทำให้เกิดปัญหาในการแสดงเครื่องหมายเวลาจริง ฉันจะขอติดตามคำถามเกี่ยวกับเรื่องนี้เพราะผมได้ตอบคำถามของวิธีการที่จะได้รับการจัดรูปแบบตัวหนาที่จะใช้ แต่ผมยังอยากรู้อยากเห็นเกี่ยวกับวิธีการตั้งค่าเริ่มต้นในการelement_markdownได้อย่างถูกต้องเพื่อที่ฉันสามารถใช้เพื่อระบุมากกว่าtextaxis.text.y