一個想法
你有沒有想過直接在R繪圖時更改字體?而不是在畫完後再在AI或者PS里手動修改?
一個測試
在R中執行如下代碼:
plot.new( )
text(0.5, 1, 'test', cex=3)
text(0.5, 0.9, 'test', cex=3, family='Courier New' )
text(0.5, 0.8, 'test', cex=3, family='Courier Old' )
text(0.5, 0.7, '中文', cex=3)
text(0.5, 0.6, 'test', cex=3, family='華文行楷' )
可見,除了人為設置的不存在的字體 Courier Old 報出警告(並使用上一次實際使用的字體繪製):
Warning messages:1: In text.default(0.5, 0.5, 'test', cex = 3, family = 'Courier Old') :字體家族'Courier Old'沒有字體
中文也未能正常顯示,而且華文行楷字體,也無法找到:
Warning messages:1: In text.default(0.5, 0.6, 'test', cex = 3, family = '華文行楷') :字體家族'華文行楷'沒有字體
那麼上圖能使用pdf()
函數原模原樣的保存在pdf文件中嗎?
實際上,只有第一個test可以正常保存(因為沒有預設字體,而使用默認字體 Helvetica),其他相繼報錯:
Error in text.default(0.5, 0.9, 'test', cex = 3, family = 'Courier New') :
字體類別出錯
此外: Warning messages:1: In text.default(0.5, 0.9, 'test', cex = 3, family = 'Courier New') :PostScript字體數據庫裡找不到'Courier New'這個字體系列
names(pdfFonts()) # pdf圖形設備可用字體
https://stackoverflow.com/questions/50431809/extra-fonts-in-pdffonts-in-r
所以,現在存在的問題主要有3個:
1、中文無法顯示
2、中文的字體無法顯示(可用字體有限)
3、保存pdf等格式文件時出錯或字體被轉為默認字體
showtext
showtext包可以完美解決上述問題。其實現原理,簡單來說是將文字轉換為圖形,然後再使用系統默認的圖形設備(pdf、png、jpeg、tif等)去繪製圖形。
showtext包雖然可以使用更豐富的字體,但是也限於系統中已經存在的字體,所以在使用之前可以先查看該字體是否存在:
library(showtext)
font_paths() # 系統中字體的查找路徑 code>
font_files() # 已存在的可用字體
使用:
showtext_auto(enable = TRUE) # 打開showtext
# 重新打開一個繪圖界面進行測試
plot(NULL, type='n', axes=FALSE, ann=FALSE, xlim=c(0,1), ylim=c(0 ,1))
text(0.4, 0.9, 'test', cex=3)
text(0.4, 0.8, '中文', cex=3)
此時,可見中英文均可正常顯示!如果想進一步設置字體的話,則需要首先使用font_add
函數將字體加載到R中:
font_add('儷黑', '儷黑Pro.ttf') # 從字體庫中導入'儷黑Pro.ttf',並將其重命名為'儷黑'
text(0.3, 0.7, '中文', cex=3, family='儷黑' ) # 設置字體
font_add('Times New Roman', 'Times New Roman.ttf')
text(0.5, 0.7, 'test', cex=3, family='Times New Roman ')
對於庫中font.paths()
不存在的字體,比如華文行楷,則可以在網上下載(一般是.ttf/.ttc/.otf格式)
http://www.fonts.net.cn/font-search-result-984339101-1.html,並將其存儲於font.paths()
文件夾下,然後使用即可:
font_add('華文行楷', 'HuaWenXingKai-1.ttf')
text(0.4, 0.6, '中文', cex=3, family='華文行楷' )
當然,如果想對多個文本整體更改字體,可以不用在每個text
函數中單獨設置,直接在par
中設置即可:
font_add('TNR', 'Times New Roman.ttf')
par(family = 'TNR')
text(0.3, 0.5, 'test', col = 'darkblue', cex=3< /span>)
text(0.5, 0.5, 'test', cex=3)
如果是對 一行文本設置不同的顯示效果 呢?
比如,對於文本 log-rank p = 0.01,此處將其設置為Courier New字體,並把
p = 0.01設置為加粗斜體:
font_add('CN', 'Courier New.ttf')
font_add('CNBI', 'Courier New Bold Italic.ttf')
text(0.42, 0.3, 'log-rank', cex=1, family = 'CN ')
text(0.58, 0.3, 'p = 0.01', cex=1, family = 'CNBI ')
既然不同字體的底層是都是轉換為基礎圖形的。那麼一些特別的符號或圖標或許也可以當做文字繪製出來!
https://www.wfonts.com、http://www.fontspace.com
font_add('PF', 'Packaging Funny.otf')
font_add('HFS', 'Hand Faces St.ttf')
font_add('GATB', 'go around the books - arrows.ttf')
text(0.7, 0.6, 'k', cex=2, family = 'GATB'< /span>)
text(0.8, 0.48, '微信公眾號: 生信控', cex=1.6, family='華文行楷')
text(0.8, 0.4, 'SXK', cex=2, family = 'PF'< /span>)
text(0.9, 0.4, 'p', cex=2, col = 'darkslateblue'< /span>, family = 'HFS')
然後,我們將上示代碼套在pdf( 'ceshi')
和dev.off()
之間就可以將繪圖結果完美的保存在pdf文件中了:
文章為用戶上傳,僅供非商業瀏覽。發布者:Lomu,轉轉請註明出處: https://www.daogebangong.com/zh-Hant/articles/detail/R%20language%20%20showtextfont%20setting.html
评论列表(196条)
测试