加载Windows系统字体到图上,解决PDF导出字体无法显示的问题
作图的时候常出现一个问题,我把windows系统字体Times New Roman
指定为图形里的字体,虽然在RStudio图形窗口会显示指定字体,但是在保存为PDF时出现问题,出现字体类别错误,指定字体无法显示。
比如说运行下面这段代码:
library(readxl)
Bar <- read_excel("Bar.xlsx", col_types = c("text", "text", "numeric"))
library(ggplot2)
windowsFonts(myFont1 = windowsFont("Times New Roman")) # 设定文字字体"Times New Roman"
ggplot(Bar,aes(x = group,y = value,fill = Cohort)) +
geom_bar(stat = "identity", position = "dodge", width=0.5) + # 条形图的位置,柱子宽度
scale_fill_hue(labels = c("组一","组二")) +
scale_x_discrete(limits = c("A","B","C","D","E")) + # X轴坐标名称
theme(axis.text.x = element_text(size = 10, color = "black", face = "bold", family = "myFont1")) + # X、Y坐标轴文字格式
theme(legend.text = element_text(face="bold", family="myFont1", colour="black",size=10)) + # 图例字体格式、颜色和大小
theme(legend.position = c(0.2,0.9), legend.background = element_blank()) # 图例位置和背景
RStudio图形窗口是这样的:
但是在输出图形时出现错误:
那么这个问题怎么解决这个问题了?
需要用到sysfonts
和showtext
两个包。
先简单说下用法:
Load the font # 第一步 加载字体
Open the graphics device # 第二步 打开图形设备
Claim that you want to use showtext to render the text # 第三步 使用showtext渲染字体
Plot # 第四步 绘图命令
Close the device # 第五步 关闭图形设备
具体操作
1. 安装和加载包
首先安装这两个包并加载
install.packages("sysfonts") # 安装包
install.packages("showtext") # 安装包
library(showtext) # 加载包
library(sysfonts) # 加载包
2. 添加系统字体
font_add("myFont1", "timesbd.ttf") # myFont1赋予字体的名称,timesbd.ttf 为 Times New Roman粗体
font_add("myFont2", "STXINGKA.TTF") # 同上,"STXINGKA.TTF"为华文行楷字体 中文
font.families() # 查看当前可用的字体名称
3. 导入数据
library(readxl)
Bar <- read_excel("Bar.xlsx", col_types = c("text", "text", "numeric"))
4. 绘制图形
先打开图形设备,然后将绘图代码放在showtext_begin()
和showtext_end()
之间。
pdf("out.pdf", width = 7, height = 5) # 打开图形设备
showtext_begin()
library(ggplot2) # 加载包
ggplot(Bar,aes(x = group,y = value,fill = Cohort)) +
geom_bar(stat = "identity", position = "dodge", width=0.5) + # 条形图的位置,柱子宽度
scale_fill_hue(labels = c("组一","组二")) +
scale_x_discrete(limits = c("A","B","C","D","E")) + # X轴刻度名称
theme(axis.text.x = element_text(size = 10, color = "black", face = "bold", family = "myFont1")) + # X、Y坐标轴文字格式
theme(legend.text = element_text(face="bold", family="myFont2", colour="black",size=10)) + # 图例字体格式、颜色和大小
theme(legend.position = c(0.2,0.9), legend.background = element_blank()) # 图例位置和背景
showtext_end() # 绘图命令放在showtext_begin()和showtext_end()之间
dev.off() # 关闭图形设备
输出图形:
从图上可以看出指定字体已经成功输出到图上了。
或者也可以:
showtext_auto() # 全局自动使用
library(ggplot2)
ggplot(Bar,aes(x = group,y = value,fill = Cohort)) +
geom_bar(stat = "identity", position = "dodge", width=0.5) + # 条形图的位置,柱子宽度
scale_fill_hue(labels = c("组一","组二")) +
scale_x_discrete(limits = c("A","B","C","D","E")) + # X轴刻度名称
theme(axis.text.x = element_text(size = 10, color = "black", face = "bold", family = "myFont1")) + # X、Y坐标轴文字格式
theme(legend.text = element_text(face="bold", family="myFont2", colour="black",size=10)) + # 图例字体格式、颜色和大小
theme(legend.position = c(0.2,0.9), legend.background = element_blank()) # 图例位置和背景
windows() # 手动打开图形设备
print(p)
ggsave("out.png", width = 7, height = 5, dpi = 600) # PNG图形设备
showtext_auto(FALSE) # 不在需要就关闭
sysfonts包
??sysfonts # 查看帮助文件
sysfonts包是用来加载系统字体文件的包。
主要函数是font_add()和font.add(),这两个函数是等效的,但首选font_add()
函数。
font_add()函数支持的格式包括但不限于TrueType字体(.ttf,.ttc)和OpenType字体(.otf)。
font_add()函数
font_add(family, # 字符串,用来命名指定加载字体的名称,可以为任意字符串
regular, # "常规"字体的字体文件路径,必须为字符串且不能省略
bold = NULL, # “粗体”字体的字体文件路径。为NULL,函数将使用"常规"参数的值
italic = NULL, # 同上
bolditalic = NULL, # 同上
symbol = NULL) # 同上
font.add()同
举例:加载constan常规斜体字体
font_add("constan", regular = "constan.ttf", italic = "constani.ttf")
说明: regular是字体文件的路径,如果字体在系统的标准位置(如Windows的C:\Windows\Fonts
)或当前工作目录,则可以直接输入文件名。
showtext包
在R中使用基本字体以外的字体并不是一件简单的事情,特别是PDF图形设备中,而showtext包就可以使我们更轻松的使用其他字体。
注意:showtext包目前并不适用于RStudio的内置图形设备。建议在原始R控制台中运行代码。
如果想在RStudio中运行代码则手动打开图形设备,如x11()和windows()。
library(showtext) # 加载包
font_add("myFont1", "timesbd.ttf") # 加载字体
showtext_auto() # 全局自动使用showtext渲染字体
windows() # 手动打开图形设设备
plot()
说明:此示例应适用于大多数图形设备,包括pdf(),png(),postscript()和屏幕设备,如windows()和x11()。
showtext_begin()和showtext_end()可以控制在哪一段代码间使用字体,而showtext_auto()是全局都使用。
参考资料
COS主站文章《showtext:字体,好玩的字体和好玩的图》 作者 邱怡轩 sysfonts包和showtext包帮助文件
以往专辑