ShowText ทำให้ง่ายต่อการใช้แบบอักษรประเภทต่างๆ (Truetype, Opentype, Type 1, Web Fonts ฯลฯ ) ในพล็อต R แรงจูงใจในการพัฒนาแพ็คเกจนี้คือการใช้แบบอักษรที่ไม่ได้มาตรฐานในพล็อต R (โดยเฉพาะอย่างยิ่งสำหรับอุปกรณ์ PDF) ไม่ตรงไปตรงมาตัวอย่างเช่นเมื่อสร้าง PDF ด้วยอักขระจีน นี่เป็นเพราะฟอนต์มาตรฐานส่วนใหญ่ที่ใช้โดย pdf() ไม่มีรัศมีอักขระจีนและผู้ใช้แทบจะไม่สามารถใช้แบบอักษรระบบใน R.
แพ็คเกจ extrafont ที่พัฒนาโดย Winston Chang เป็นวิธีแก้ปัญหาที่ดีสำหรับปัญหานี้ซึ่งส่วนใหญ่มุ่งเน้นไปที่การใช้แบบอักษร Truetype ( .ttf ) ในอุปกรณ์กราฟิก PDF ตอนนี้ ShowText สามารถรองรับรูปแบบตัวอักษรมากขึ้นและอุปกรณ์กราฟิกมากขึ้นและหลีกเลี่ยงการใช้ซอฟต์แวร์ภายนอกเช่น Ghostscript
library( showtext )
# # Loading Google fonts (https://fonts.google.com/)
font_add_google( " Gochi Hand " , " gochi " )
font_add_google( " Schoolbell " , " bell " )
font_add_google( " Covered By Your Grace " , " grace " )
font_add_google( " Rock Salt " , " rock " )
# # Automatically use showtext to render text for future devices
showtext_auto()
# # Tell showtext the resolution of the device,
# # only needed for bitmap graphics. Default is 96
showtext_opts( dpi = 96 )
set.seed( 123 )
x = rnorm( 10 )
y = 1 + x + rnorm( 10 , sd = 0.2 )
y [ 1 ] = 5
mod = lm( y ~ x )
op = par( cex.lab = 2 , cex.axis = 1.5 , cex.main = 2 )
plot( x , y , pch = 16 , col = " steelblue " ,
xlab = " X variable " , ylab = " Y variable " , family = " gochi " )
grid()
title( " Draw Plots Before You Fit A Regression " , family = " bell " )
text( - 0.5 , 4.5 , " This is the outlier " , cex = 2 , col = " steelblue " ,
family = " grace " )
abline(coef( mod ))
abline( 1 , 1 , col = " red " )
par( family = " rock " )
text( 1 , 1 , expression(paste( " True model: " , y == x + 1 )),
cex = 1.5 , col = " red " , srt = 20 )
text( 0 , 2 , expression(paste( " OLS: " , hat( y ) == 0.79 * x + 1.49 )),
cex = 1.5 , srt = 15 )
legend( " topright " , legend = c( " Truth " , " OLS " ), col = c( " red " , " black " ), lty = 1 )
par( op ) ในตัวอย่างนี้เราโหลดฟอนต์บางตัวที่พร้อมใช้งานออนไลน์ผ่าน Google Fonts จากนั้นบอก R ให้แสดงข้อความโดยใช้ showText โดยเรียกฟังก์ชัน showtext_auto() ส่วนที่เหลือทั้งหมดนั้นเหมือนกับคำสั่งพล็อตปกติ
ตัวอย่างนี้ควรทำงานกับอุปกรณ์กราฟิกส่วนใหญ่รวมถึง pdf() , png() , postscript() และอุปกรณ์บนหน้าจอเช่น windows() บน Windows และ x11() บน Linux
ก่อนอื่นให้ฉันอธิบายเล็กน้อยว่า pdf() ทำงานอย่างไร
เพื่อความรู้ที่ดีที่สุดของฉันอุปกรณ์ PDF เริ่มต้นใน R ไม่ได้ "วาด" ข้อความ แต่จริง ๆ แล้ว "อธิบาย" ข้อความในไฟล์ PDF กล่าวคือแทนที่จะวาดเส้นและเส้นโค้งของร่ายมนตร์ที่แท้จริงมันจะฝังข้อมูลเกี่ยวกับข้อความเท่านั้นตัวอย่างเช่นตัวละครที่มีตัวอักษรที่ใช้ ฯลฯ
อย่างไรก็ตามข้อความที่มีตัวอักษรที่ประกาศอาจแสดงแตกต่างกันในระบบปฏิบัติการที่แตกต่างกันซึ่งหมายความว่าการปรากฏตัวของกราฟที่สร้างโดย pdf() นั้นขึ้นอยู่กับระบบ หากคุณโชคไม่ดีที่ไม่มีแบบอักษรที่ประกาศไว้ในระบบของคุณคุณอาจไม่สามารถเห็นข้อความได้อย่างถูกต้องเลย
ในการเปรียบเทียบแพ็คเกจ Showtext พยายามแก้ปัญหานี้โดยการแปลงข้อความเป็นโครงร่างรูปหลายเหลี่ยมที่เต็มไปด้วยสี (สำหรับกราฟิกเวกเตอร์) หรือภาพแรสเตอร์ (สำหรับบิตแมปและกราฟิกบนหน้าจอ) ดังนั้นจึงมีลักษณะเหมือนกันภายใต้แพลตฟอร์มทั้งหมด ผู้ที่ดูกราฟนี้ไม่จำเป็นต้องติดตั้งแบบอักษรที่สร้างกราฟ ให้ความสะดวกสบายแก่ผู้สร้างกราฟและผู้ชมกราฟ
ที่สำคัญกว่านั้น ShowText สามารถใช้ไฟล์แบบอักษรระบบเพื่อให้คุณสามารถแสดงข้อความในกราฟด้วยใบหน้าแบบอักษรที่คุณชื่นชอบตราบใดที่ Freetype รองรับ ดูส่วน การโหลดแบบอักษร ด้านล่าง
ในการสร้างกราฟโดยใช้แบบอักษรที่ระบุคุณเพียงทำสิ่งต่อไปนี้:
เฉพาะขั้นตอนที่ทำเครื่องหมายด้วย (*) ใหม่ หากคุณต้องการใช้ ShowText ทั่วโลกคุณสามารถเรียกฟังก์ชั่น showtext_auto() หนึ่งครั้งแล้วอุปกรณ์ทั้งหมดหลังจากนั้นจะใช้ showtext เพื่อแสดงข้อความโดยอัตโนมัติเป็นตัวอย่างในการแสดงเริ่มต้น
หากคุณต้องการมีการควบคุมที่ดีกว่าซึ่งส่วนใดของรหัสควรใช้ showtext ฟังก์ชั่น showtext_begin() และ showtext_end() จะช่วยได้ เฉพาะฟังก์ชั่นการพล็อตที่ล้อมรอบด้วยการโทรคู่นี้เท่านั้นที่จะใช้ showtext และอื่น ๆ ไม่ได้ ตัวอย่างเช่นในการเปลี่ยนแบบอักษรชื่อเท่านั้นเราสามารถทำได้:
library( showtext )
font_add_google( " Schoolbell " , " bell " )
# # By default the automatic call of showtext is disabled
# # You can manually turn it off using the line below
# # showtext_auto(enable = FALSE)
# # To use showtext_begin() and showtext_end() you need to
# # explicitly open a graphics device
png( " demo.png " , 700 , 600 , res = 96 )
set.seed( 123 )
x = rnorm( 10 )
y = 1 + x + rnorm( 10 , sd = 0.2 )
y [ 1 ] = 5
mod = lm( y ~ x )
op = par( cex.lab = 1.5 , cex.axis = 1.5 , cex.main = 2 )
plot( x , y , pch = 16 , col = " steelblue " ,
xlab = " X variable " , ylab = " Y variable " )
grid()
# # Use showtext only for this part
showtext_begin()
title( " Draw Plots Before You Fit A Regression " , family = " bell " )
showtext_end()
text( - 0.5 , 4.5 , " This is the outlier " , cex = 2 , col = " steelblue " )
abline(coef( mod ))
abline( 1 , 1 , col = " red " )
text( 1 , 1 , expression(paste( " True model: " , y == x + 1 )),
cex = 1.5 , col = " red " , srt = 20 )
text( 0 , 2 , expression(paste( " OLS: " , hat( y ) == 0.79 * x + 1.49 )),
cex = 1.5 , srt = 15 )
legend( " topright " , legend = c( " Truth " , " OLS " ), col = c( " red " , " black " ), lty = 1 )
par( op )
dev.off()การโหลดแบบอักษรทำได้จริงโดยแพ็คเกจ sysfonts
วิธีที่ง่ายในการโหลดแบบอักษรลงใน ShowText คือการโทรหา font_add(family, regular) ซึ่ง family คือชื่อที่คุณกำหนดให้กับแบบอักษรนั้น (เพื่อให้คุณสามารถเรียก par(family = ...) เพื่อใช้แบบอักษรนี้ในการพล็อต) และ regular คือเส้นทางไปยังไฟล์ตัวอักษร กล่าวคือการรู้ว่า "ชื่อตัวอักษร" ไม่เพียงพอเนื่องจากพวกเขามักจะขึ้นอยู่กับระบบ ในทางตรงกันข้ามไฟล์ฟอนต์เป็นเอนทิตีที่ให้ร่ายมนตร์อักขระจริง
โดยปกติแล้วไฟล์ฟอนต์จะอยู่ในไดเรกทอรี "มาตรฐาน" บางอย่างในระบบ (ตัวอย่างเช่นบน Windows โดยทั่วไปแล้วจะเป็น C:WindowsFonts ) คุณสามารถใช้ font_paths() เพื่อตรวจสอบเส้นทางการค้นหาปัจจุบันหรือเพิ่มเส้นทางใหม่และใช้ font_files() เพื่อแสดงรายการไฟล์ตัวอักษรที่มีอยู่ในเส้นทางการค้นหา font_files() ยังแสดงข้อมูลที่เป็นประโยชน์อื่น ๆ เช่นชื่อครอบครัวที่คุณมักจะใช้เพื่อระบุตัวอักษรและตัวอักษรใบหน้าสำหรับตัวแปรที่แตกต่างกัน ด้านล่างเป็นตัวอย่างในการแสดงผลลัพธ์บนเครื่องของฉัน:
head(font_files())
# # path file family
# # 1 ***/.local/share/fonts Flavors-Regular.ttf Flavors
# # 2 ***/.local/share/fonts FrederickatheGreat-Regular.ttf Fredericka the Great
# # 3 ***/.local/share/fonts GandhiSerif-Bold.otf Gandhi Serif
# # 4 ***/.local/share/fonts GandhiSerif-BoldItalic.otf Gandhi Serif
# # 5 ***/.local/share/fonts GandhiSerif-Italic.otf Gandhi Serif
# # 6 ***/.local/share/fonts GandhiSerif-Regular.otf Gandhi Serif
# #
# # face version ps_name
# # 1 Regular Version 1.001 Flavors-Regular
# # 2 Regular Version 1.001 FrederickatheGreat-Regular
# # 3 Bold Version 1.001 GandhiSerif-Bold
# # 4 Bold Italic Version 1.001 GandhiSerif-BoldItalic
# # 5 Italic Version 1.001 GandhiSerif-Italic
# # 6 Regular Version 1.001 GandhiSerif-Regularและรหัสด้านล่างแสดงวิธีการโหลดและใช้แบบอักษรระบบบน Windows:
library( showtext )
# # Add fonts that are available on Windows
font_add( " heiti " , " simhei.ttf " )
font_add( " constan " , " constan.ttf " , italic = " constani.ttf " )
library( ggplot2 )
p = ggplot( NULL , aes( x = 1 , y = 1 )) + ylim( 0.8 , 1.2 ) +
theme( axis.title = element_blank(), axis.ticks = element_blank(),
axis.text = element_blank()) +
annotate( " text " , 1 , 1.1 , family = " heiti " , size = 15 ,
label = " u 4F60 u 597D u FF0C u 4E16 u 754C " ) +
annotate( " text " , 1 , 0.9 , label = ' Chinese for "Hello, world!" ' ,
family = " constan " , fontface = " italic " , size = 12 )
# # Automatically use showtext for new devices
showtext_auto()
# # On-screen device
x11()
print( p )
dev.off()
# # PDF device
pdf( " showtext-example-3.pdf " , 7 , 4 )
print( p )
dev.off()
# # PNG device
ggsave( " showtext-example-4.png " , width = 7 , height = 4 , dpi = 96 )
# # Turn off if no longer needed
showtext_auto( FALSE ) สำหรับระบบปฏิบัติการอื่น ๆ คุณอาจไม่มีไฟล์ Font simhei.ttf แต่ไม่มีปัญหาในการใช้อย่างอื่น ในปัจจุบัน font_add() รองรับ Fonts TrueType (*. TTF/*. TTC) และ Opentype Fonts (*. OTF) และการเพิ่มแบบอักษรใหม่นั้นเป็นเรื่องเล็กน้อยตราบใดที่ Freetype รองรับ
นอกจากนี้ยังมีแบบอักษรฟรีมากมายและเข้าถึงได้บนเว็บเช่นโครงการ Google Fonts (https://fonts.google.com/) Sysfonts จัดเตรียมอินเทอร์เฟซเพื่อดาวน์โหลดและลงทะเบียนแบบอักษรเหล่านั้นโดยอัตโนมัติผ่านฟังก์ชั่น font_add_google() ตามตัวอย่างด้านล่างแสดง
library( showtext )
font_add_google( " Lobster " , " lobster " )
showtext_auto()
plot( 1 , pch = 16 , cex = 3 )
text( 1 , 1.1 , " A fancy dot " , family = " lobster " , col = " steelblue " , cex = 3 ) ShowText รวมถึง Font Open Source CJK (จีนญี่ปุ่นและเกาหลี) แบบอักษร Wenquanyi Micro Hei หากคุณเพียงต้องการแสดงข้อความ CJK ในกราฟของคุณเพียงระบุชื่อตระกูล wqy-microhei ในฟังก์ชั่นการวางแผน
ตัวเลือกอื่นคือการติดตั้งแบบอักษร Han Sans/Serif ในเครื่องโดยใช้รหัสต่อไปนี้:
library( showtext )
font_install(source_han_serif())
font_families()
# # [1] "sans" "serif" "mono" "wqy-microhei"
# # [5] "source-han-serif-cn" ดู ?font_install และ ?source_han สำหรับรายละเอียดเพิ่มเติม
อุปกรณ์กราฟิกทุกชิ้นใน R ใช้ฟังก์ชั่นบางอย่างเพื่อวาดองค์ประกอบกราฟิกที่เฉพาะ showtext เช่น path() และ polygon() เพื่อวาดรูปหลายเหลี่ยม raster() เพื่อแสดงภาพบิตแมปข้อความ path() text() raster() textUTF8() เพื่อแสดง ข้อความ ฯลฯ การแสดงของตัวเอง
การกระทำนี้จะทำเฉพาะเมื่อคุณเรียก showtext_begin() และจะไม่แก้ไขอุปกรณ์กราฟิกถ้าคุณเรียก showtext_end() เพื่อกู้คืนฟังก์ชั่นอุปกรณ์ดั้งเดิมกลับมา
เริ่มต้นจากเวอร์ชัน 0.9 ShowText สามารถทำงานได้ดีกับอุปกรณ์กราฟิก RSTUDIO (RSTUDIOGD) เพียงแค่เรียก showtext_auto() ในเซสชัน rstudio จากนั้นพล็อตจะปรากฏขึ้นอย่างถูกต้อง