一个想法
你有没有想过直接在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() # 系统中字体的查找路径
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)
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')
text(0.8, 0.48, '微信公众号: 生信控', cex=1.6, family='华文行楷')
text(0.8, 0.4, 'SXK', cex=2, family = 'PF')
text(0.9, 0.4, 'p', cex=2, col = 'darkslateblue', family = 'HFS')
然后,我们将上示代码套在 pdf('ceshi')
和 dev.off()
之间就可以将绘图结果完美的保存在pdf文件中了:
文章为用户上传,仅供非商业浏览。发布者:Lomu,转转请注明出处: https://www.daogebangong.com/articles/detail/R%20language%20%20showtextfont%20setting.html
评论列表(196条)
测试