ShowText memudahkan untuk menggunakan berbagai jenis font (Truetype, OpenType, Tipe 1, Web Font, dll.) Dalam plot R. Motivasi untuk mengembangkan paket ini adalah bahwa menggunakan font non-standar di plot R (terutama untuk perangkat PDF) tidak mudah, misalnya, saat membuat PDF dengan karakter Cina. Ini karena sebagian besar font standar yang digunakan oleh pdf() tidak mengandung mesin terbang karakter Cina, dan pengguna hampir tidak dapat menggunakan font sistem di R.
Paket Extrafont yang dikembangkan oleh Winston Chang adalah salah satu solusi yang bagus untuk masalah ini, yang terutama berfokus pada penggunaan TrueType Fonts ( .ttf ) di perangkat grafis PDF. Sekarang ShowText dapat mendukung lebih banyak format font dan lebih banyak perangkat grafis, dan menghindari penggunaan perangkat lunak eksternal seperti 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 ) Dalam contoh ini kami pertama -tama memuat beberapa font yang tersedia online melalui Google Fonts, dan kemudian memberi tahu R untuk membuat teks menggunakan ShowText dengan memanggil fungsi showtext_auto() . Semua bagian yang tersisa persis sama dengan perintah plot yang biasa.
Contoh ini harus bekerja pada sebagian besar perangkat grafis, termasuk pdf() , png() , postscript() , dan perangkat di layar seperti windows() pada windows dan x11() di Linux.
Izinkan saya menjelaskan sedikit bagaimana pdf() bekerja.
Sepengetahuan saya, perangkat PDF default di R tidak "menggambar" teks, tetapi sebenarnya "menjelaskan" teks dalam file PDF. Artinya, alih -alih menggambar garis dan kurva dari mesin terbang yang sebenarnya, itu hanya menanamkan informasi tentang teks, misalnya karakter apa yang dimilikinya, font yang digunakannya, dll.
Namun, teks dengan font yang dinyatakan dapat ditampilkan secara berbeda dalam OS yang berbeda, yang berarti bahwa penampilan grafik yang dibuat oleh pdf() bergantung pada sistem. Jika Anda sayangnya tidak memiliki font yang dinyatakan dalam sistem Anda, Anda mungkin tidak dapat melihat teks dengan benar sama sekali.
Sebagai perbandingan, Paket ShowText mencoba menyelesaikan masalah ini dengan mengubah teks menjadi garis poligonal yang dipenuhi warna (untuk grafik vektor) atau gambar raster (untuk bitmap dan grafik di layar), sehingga memiliki penampilan yang sama di bawah semua platform. Orang yang melihat grafik ini tidak perlu menginstal font yang membuat grafik. Ini memberikan kenyamanan bagi pembuat grafik dan pemirsa grafik.
Lebih penting lagi, ShowText dapat menggunakan file font sistem, sehingga Anda dapat menampilkan teks dalam grafik dengan wajah font favorit Anda, selama itu didukung oleh Freetype. Lihat bagian font pemuatan di bawah ini.
Untuk membuat grafik menggunakan font yang ditentukan, Anda cukup melakukan hal berikut:
Hanya langkah -langkah yang ditandai dengan (*) yang baru. Jika Anda ingin menggunakan ShowText secara global, Anda dapat memanggil fungsi showtext_auto() sekali, dan kemudian semua perangkat setelah itu akan secara otomatis menggunakan ShowText untuk membuat teks, sebagai contoh di awal yang ditampilkan.
Jika Anda ingin memiliki kontrol yang lebih baik pada bagian mana dari kode yang harus menggunakan showText , fungsi showtext_begin() dan showtext_end() akan membantu. Hanya fungsi merencanakan yang terlampir oleh sepasang panggilan ini yang akan menggunakan showtext , dan yang lainnya tidak. Misalnya, untuk mengubah font judul saja, kita dapat melakukan:
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()Memuat font sebenarnya dilakukan oleh paket Sysfonts .
Cara mudah untuk memuat font ke showtext adalah dengan menelepon font_add(family, regular) , di mana family adalah nama yang Anda tetapkan untuk font itu (sehingga nanti Anda dapat memanggil par(family = ...) untuk menggunakan font ini dalam plot), dan regular adalah jalur ke file font. Dengan kata lain, hanya mengetahui "nama font" tidak cukup, karena mereka biasanya bergantung pada sistem. Sebaliknya, file font adalah entitas yang benar -benar menyediakan mesin terbang karakter.
Biasanya file font terletak di beberapa direktori "standar" dalam sistem (misalnya pada Windows biasanya C:WindowsFonts ). Anda dapat menggunakan font_paths() untuk memeriksa jalur pencarian saat ini atau menambahkan yang baru, dan menggunakan font_files() untuk mendaftar file font yang tersedia di jalur pencarian. font_files() juga mencantumkan beberapa informasi berguna lainnya, misalnya nama keluarga yang biasanya Anda gunakan untuk menentukan font, dan wajah font untuk varian yang berbeda. Di bawah ini adalah contoh untuk menunjukkan hasil pada mesin saya:
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-RegularDan kode di bawah ini menunjukkan cara memuat dan menggunakan font sistem pada 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 ) Untuk OS lain, Anda mungkin tidak memiliki file font simhei.ttf , tetapi tidak ada kesulitan dalam menggunakan sesuatu yang lain. Saat ini font_add() mendukung font truetype (*. TTF/*. TTC) dan openpe font (*. OTF), dan menambahkan tipe font baru sepele selama Freetype mendukungnya.
Juga, ada banyak font gratis yang tersedia dan dapat diakses di web, misalnya proyek Google Fonts (https://fonts.google.com/). Sysfonts menyediakan antarmuka untuk secara otomatis mengunduh dan mendaftarkan font tersebut melalui fungsi font_add_google() , seperti yang ditunjukkan contoh di bawah ini.
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 mencakup font CJK open source (Cina, Jepang, dan Korea) Wenquanyi Micro Hei. Jika Anda hanya ingin menampilkan teks CJK di grafik Anda, cukup tentukan nama keluarga wqy-microhei dalam fungsi plot.
Opsi lain adalah menginstal sumber font Han Sans/Serif secara lokal menggunakan kode berikut:
library( showtext )
font_install(source_han_serif())
font_families()
# # [1] "sans" "serif" "mono" "wqy-microhei"
# # [5] "source-han-serif-cn" Lihat ?font_install dan ?source_han untuk lebih jelasnya.
Every graphics device in R implements some functions to draw specific graphical elements, eg, path() and polygon() to draw polygons, raster() to display bitmap images, text() or textUTF8() to show text, etc. What showtext does is to override their own text rendering functions and replace them by hooks provided in showtext that will further call the device's path() or raster() functions to draw the character mesin terbang.
Tindakan ini dilakukan hanya ketika Anda memanggil showtext_begin() dan tidak akan memodifikasi perangkat grafis jika Anda memanggil showtext_end() untuk mengembalikan fungsi perangkat asli kembali.
Mulai dari versi 0.9, ShowText dapat bekerja dengan baik dengan perangkat grafis RStudio (RStudiOGD). Cukup hubungi showtext_auto() di sesi rStudio dan kemudian plot akan ditampilkan dengan benar.