R语言学习 - 中英字体的图形设置

2023-05-22


在绘制生信秘诀调查总结文中的柱形图时,出现了中文乱码,搜索了以下解决方案,记录如下。


修改图形字体

在ggplot2中修改图形字体。


# 修改坐标轴和legend、标题的字体
theme(text=element_text(family="Arial"))
# 或是
theme_bw(base_family="Arial")

# 修改geom_text字体
geom_text(family="Arial")

ggplot2支持PDF导出中文字体

showtext包可以给出字体文件,加载到R环境中,生成新的字体家族名称。以后调用这个名字设置字体,支持用中文写pdf好码。


library(showtext)
showtext.auto(enable=TRUE)

font_path = "FZSTK.TTF"
font_name = tools::file_path_sans_ext(basename(font_path))
font.add(font_name, font_path)

# 修改坐标轴和legend、标题的字体
theme(text=element_text(family=font_name))

# 修改geom_text字体
geom_text(family=font_name)

字体可以用于系统

  • 一般来说,Linux字体/usr/share/fonts下面,也可以使用fc-list列出所载字体。
  • Windows字体C:\Windows\Fonts\下面,可以直接看到,也可以复制到Linux下使用。

合并字体支持中英文

一般来说,绘图的字体都是英文的,ggplot2默认或者根据需要加载一个字体。但是,如果中英文混合出现,单个字体只能支持一个字体,最好的办法就是合并两个字体,类似于在Word中设置中英文字体,使用不同的字体。


该软件FontForge可以方便地合并中英文字体,其安装也很简单,直接。yum install fontforge.x86_64


如果需要合并的话FZSTK.TTF(在windows下获得)和Schoolbell-Regular.ttf(谷歌下载),两者都是手写字体。根据以下内容,将字体文件和流程脚本mergefont.pe把它放在同一个目录下,运行。fontforge -script mergefont.pe可以得到合并后的字体FZ_School.ttf


$ ls
FZSTK.TTF mergefont.pe Schoolbell-Regular.ttf
$ cat mergefont.pe
Open("FZSTK.TTF")
SelectAll()
ScaleToEm(1024)
Generate("temp.ttf", "", 0x14)
Close()

# Open English font and merge to the Chinese font
Open("Schoolbell-Regular.ttf")
SelectAll()
ScaleToEm(1024)

MergeFonts("temp.ttf")
SetFontNames("FZ_School", "FZST", "Schoolbel", "Regular", "")
Generate("FZ_School.ttf", "", 0x14)
Close()

$ fontforge -script mergefont.pe
$ ls
FZ_School.ttf FZSTK.TTF mergefont.pe Schoolbell-Regular.ttf

后来安装前面的介绍使用。showtext可以通过导入使用。


一个示例

从Windows获取字体文件,School bell从Google 获得fonts。


library(showtext)
## Add fonts that are available on current path

# 方正字体 schoole bell (中英混合)
font.add("FZ_School", "FZ_School.ttf")
# 黑体
font.add("simhei", "simhei.ttf")
font.add("Arial","arial.ttf")

# Arial和黑体的组合
font.add("HeiArial", "HeiArial.ttf")
showtext.auto()  ## automatically use showtext for new devices

library(ggplot2)

p = ggplot(NULL, aes(x = 1:10, y = 2^(1:10), group=1))   geom_line()  
  theme(axis.title.y=element_text(family="Arial"), axis.title.x=element_text(family="HeiArial"),
        plot.title=element_text(family="simhei"))  
  xlab("Days spent on 生活秘密")  
  ylab("Things you have learned")  
  ggtitle("生信秘诀,学生信从另一个角度“)  
  annotate("text", 7, 300, family = "FZ_School", size = 8,
           label = "获得曲线 (Harvest curve)", angle=15)

# annotate指定了汉字中间部分的位置。

ggsave(p, filename="example-SXBD.pdf", width = 7, height = 4)  ## PDF device

Reference

  • 中英文字体混合:
    http://www.voidcn.com/article/p-gnggkwmy-vn.html
  • 改变字体类型:
    https://github.com/yixuan/showtext
  • 获取文件名:
    https://stackoverflow.com/questions/29113973/getting-filename-without-extension-in-r


本文仅代表作者观点,版权归原创者所有,如需转载请在文中注明来源及作者名字。

免责声明:本文系转载编辑文章,仅作分享之用。如分享内容、图片侵犯到您的版权或非授权发布,请及时与我们联系进行审核处理或删除,您可以发送材料至邮箱:service@tojoy.com