:R语言 | showtext-字体设置-佳作欣赏免费ppt模版下载-道格办公

R语言 | showtext-字体设置

t('Hello, World!', family = 'Arial')

一个想法


你有没有想过直接在R绘图时更改字体?而不是在画完后再在AI或者PS里手动修改?

一个测试


在R中执行如下代码:

  1. plot.new()

  2. text(0.5, 1, 'test', cex=3)

  3. text(0.5, 0.9, 'test', cex=3, family='Courier New')

  4. text(0.5, 0.8, 'test', cex=3, family='Courier Old')

  5. text(0.5, 0.7, '中文', cex=3)

  6. 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'这个字体系列

  1. 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包虽然可以使用更丰富的字体,但是也限于系统中已经存在的字体,所以在使用之前可以先查看该字体是否存在:

  1. library(showtext)

  2. font_paths()    # 系统中字体的查找路径

  3. font_files()    # 已存在的可用字体

使用:
  1. showtext_auto(enable = TRUE)  # 打开showtext

  2. # 重新打开一个绘图界面进行测试

  3. plot(NULL, type='n', axes=FALSE, ann=FALSE, xlim=c(0,1), ylim=c(0,1))    

  4. text(0.4, 0.9, 'test', cex=3)

  5. text(0.4, 0.8, '中文', cex=3)

此时,可见中英文均可正常显示!如果想进一步设置字体的话,则需要首先使用 font_add 函数将字体加载到R中:

  1. font_add('俪黑', '儷黑 Pro.ttf')    # 从字体库中导入'儷黑 Pro.ttf',并将其重命名为'俪黑'

  2. text(0.3, 0.7, '中文', cex=3, family='俪黑')    # 设置字体

  3. font_add('Times New Roman', 'Times New Roman.ttf')

  4. 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()文件夹下,然后使用即可:

  1. font_add('华文行楷', 'HuaWenXingKai-1.ttf')

  2. text(0.4, 0.6, '中文', cex=3, family='华文行楷')

当然,如果想对多个文本整体更改字体,可以不用在每个 text函数中单独设置,直接在 par中设置即可:

  1. font_add('TNR', 'Times New Roman.ttf')

  2. par(family = 'TNR')

  3. text(0.3, 0.5, 'test', col = 'darkblue', cex=3)

  4. text(0.5, 0.5, 'test', cex=3)

如果是对 一行文本设置不同的显示效果 呢?

比如,对于文本 log-rank p = 0.01,此处将其设置为Courier New字体,并把

p = 0.01设置为加粗斜体:

  1. font_add('CN', 'Courier New.ttf')

  2. font_add('CNBI', 'Courier New Bold Italic.ttf')

  3. text(0.42, 0.3, 'log-rank', cex=1, family = 'CN')

  4. text(0.58, 0.3, 'p = 0.01', cex=1, family = 'CNBI')

既然不同字体的底层是都是转换为基础图形的。那么一些特别的符号或图标或许也可以当做文字绘制出来!

https://www.wfonts.comhttp://www.fontspace.com

  1. font_add('PF', 'Packaging Funny.otf')

  2. font_add('HFS', 'Hand Faces St.ttf')

  3. font_add('GATB', 'go around the books - arrows.ttf')

  4. text(0.7, 0.6, 'k', cex=2, family = 'GATB')

  5. text(0.8, 0.48, '微信公众号: 生信控', cex=1.6, family='华文行楷')

  6. text(0.8, 0.4, 'SXK', cex=2, family = 'PF')

  7. 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

(810)
打赏 支付宝扫一扫 支付宝扫一扫
single-end

相关推荐