showtext

2023-11-04

R语言绘图的字体设置是个老大难的问题,它默认情况下只提供三种字体。本篇推文介绍两种字体设置方法(针对Windows系统),一种是R语言本身的字体设置方法,另一种是showtext等工具包提供的相关方法。

1 系统设置方法

1.1 「原生样式」

R语言系统自有的三种字体可以通过windowsFonts()语句查看:

windowsFonts() 

## $serif
## [1] "TT Times New Roman"
## 
## $sans
## [1] "TT Arial"
## 
## $mono
## [1] "TT Courier New"

它表达的是一种映射关系,即serif代表Times New Roman字体,sans代表Arial字体,mono代表Courier New字体。这种映射关系在基础绘图系统和ggplot2系统中均可使用。

在绘图系统中,有两个参数与字体设置相关:family和font(ggplot2系统为fontface),前者即一般意义上的字体,后者为字型,包括常规、加粗、斜体、加粗斜体等,在基础绘图系统中分别使用1-4之间的整数表示。

基础绘图系统:

plot(1:3, ann = F, axes = F, type = "n", frame.plot = T)
text(2,2.5, "Times New Roman", 
     family = "serif", font = 2)
text(2,2, "Arial", 
     family = "sans", font = 3)
text(2,1.5, "Courier New", 
     family = "mono", font = 4)
7d01b1da63d1d292eff7c261ed802a53.png

ggplot2绘图系统:

library(ggplot2)
ggplot() +
  geom_text(aes(1,3), label = "Times New Roman",
            family = "serif", fontface = "bold") +
  geom_text(aes(1,2), label = "Arial",
            family = "sans", fontface = "italic") +
  geom_text(aes(1,1), label = "Courier New",
            family = "mono", fontface = "bold.italic") +
  labs(x = NULL, y = NULL) +
  theme(axis.text = element_blank(),
        axis.ticks = element_blank())
a3e579f32d9b6d0957489f8986c4f052.png

1.2 「自定义设置」

对于其他字体,在使用前需要自定义映射关系。用到的函数有windowsFont()windowsFonts()两个。如自定义楷体和宋体的映射关系:

windowsFonts(
  KT = windowsFont("楷体"),
  ST = windowsFont("宋体")
)
  • 在自定义前需确保电脑已经安装了所需的字体。对于Windows系统而言,字体安装的路径一般为C:/Windows/Fonts

运行自定义语句后,再次运行WindowsFonts()语句:

windowsFonts()

## $serif
## [1] "TT Times New Roman"
## 
## $sans
## [1] "TT Arial"
## 
## $mono
## [1] "TT Courier New"
## 
## $KT
## [1] "楷体"
## 
## $ST
## [1] "宋体"

可以发现,新定义的映射关系已经添加到系统了,此时就可以使用family = KTfamily = ST进行调用了。

基础绘图系统:

plot(1:3, ann = F, axes = F, type = "n", frame.plot = T)
text(2,2, "楷体", family = "KT",)
text(2,1.5, "宋体", family = "ST")
ead7d179ffc87a44db1c2ba19e514ca6.png

ggplot2绘图系统:

library(ggplot2)
ggplot() +
  geom_text(aes(1,3), label = "楷体",
            family = "KT") +
  geom_text(aes(1,2), label = "宋体",
            family = "ST") +
  labs(x = NULL, y = NULL) +
  theme(axis.text = element_blank(),
        axis.ticks = element_blank())
2595b58e2cfa80a620c68bdc705a6f2b.png

在使用上述方法时需注意以下两点:

  • 自定义的映射关系是“临时”的,一旦重新启动R程序,映射关系就会恢复原来的状态(即仅有三种映射关系);

  • 使用自定义映射字体后,在输出图片时只能保存为JPEG、PNG等位图格式,因为保存成PDF、EPS等矢量格式会出错,尤其是中文字体,会导致文字消失。

showtext工具包

showtext工具包可以通过install.packages()函数进行安装,同时会安装sysfontsshowtextdb两个相关包。

# install.packages(showtext)
library(showtext)

## Warning: 程辑包'showtext'是用R版本4.1.3 来建造的
## 载入需要的程辑包:sysfonts
## Warning: 程辑包'sysfonts'是用R版本4.1.3 来建造的
## 载入需要的程辑包:showtextdb
## Warning: 程辑包'showtextdb'是用R版本4.1.3 来建造的

关于该包的详细使用方法可参见作者的说明文档:

https://mirrors.tuna.tsinghua.edu.cn/CRAN/web/packages/showtext/vignettes/introduction.html

该包的使用要点如下:

  • 一、确定加载字体的路径和该路径下可用的字体,涉及的函数有font_paths()font_files(),这些函数来自sysfonts工具包;

  • 二、将所需的字体加载到R的环境中,涉及的函数是font.add(),也来自sysfonts工具包;

  • 三、确认使用showtext工具包功能的绘图语句范围,涉及的函数有showtext_auto()showtext_begin()showtext_end(),这些函数来自showtext工具包。

下面分别对这些要点进行解释。

2.1 「要点一」

“确定字体路径”一般可以忽略,因为该方法默认的字体路径就是C:/Windows/Fonts

font_paths()

## [1] "C:\\Windows\\Fonts"

添加新路径:

font_paths("E:/")

## [1] "E:\\"               "C:\\Windows\\Fonts"

“确认路径下可用字体”可通过font_files()函数查看:

font_all <- font_files()

将输出结果命名为font_all,可以发现其数据结构为数据框,如下图所示,共包含5列,其中重要信息为中间三列:

6c7af41907c4559e40da2232b4d8c8ba.png

familyfont的含义与绘图系统中的同名参数类似,而file为该字体在电脑中对应的文件名称。可以看出,有些字体不同字型(font)对应的文件名称是一样的,而有些则不一样。

该数据框中没有中文字符,因为中文字体文件也是以英文形式命名的。如在C:/Windows/Fonts中找到“宋体 常规”,右键单击属性,如下图所示,其文件名称为simsun.ttc

fd6ea5130d0526aec9ef3fa4395ad041.png

在数据框的第395行可以发现它的信息:

6defb5ba76258e1f9c50d4b66b049ec4.png

2.2 「要点二」

font.add()函数的语法结构如下:

font_add(family, regular,
  bold = NULL, italic = NULL,
  bolditalic = NULL, symbol = NULL
)
  • family:字体,即数据框中的family列;必选项;

  • regular:常规字型对应的文件名,即数据框中font列中Regular对应于file列中的元素;必选项;

  • 其他参数为对应字型的文件名;非必选项;缺失时默认同regular参数。

在使用该函数时,family参数不需要与数据框中的family列一致,可以为任意字符,而regular等参数必须与file列一致,否则会报错。

## 将加载的宋体定义为"ST"
font_add("ST", regular = "simsun.ttc")

## 来自作者说明文档:https://mirrors.tuna.tsinghua.edu.cn/CRAN/web/packages/showtext/vignettes/introduction.html
font_add("heiti", "simhei.ttf")
font_add("constan", regular = "constan.ttf",
         italic = "constani.ttf")

2.3 「要点三」

将相应字体加载到环境中就具备了使用的可能性。要想真正能够使用,还需要确定使用范围,以下两种情况必须选择其一:

  • showtext_auto():在全局环境使用相应的字体;

  • showtext_begin()showtext_end():仅在这两个函数之间的绘图代码中使用相应字体,showtext_begin()之前的绘图代码和showtext_end()之后的绘图代码均无法调用加载的字体。

此外,在绘图前,还需要使用x11()函数打开绘图窗口(悬浮状态)。

以下例子来自作者说明文档:

## 在全局使用
showtext_auto()
x11()

ggplot(NULL, aes(x = 1, y = 1)) + 
  ylim(0.8, 1.2) +
  theme(axis.title = element_blank(),
        axis.ticks = element_blank(),
        axis.text = element_blank()) +
  annotate("text", 1, 1.1, size = 15,
           family = "heiti",
           label = "你好,世界") +
  annotate("text", 1, 0.9, 
           label = 'Chinese for "Hello, world!"',
           family = "constan", 
           fontface = "italic", size = 12)
d8ee7c061a6a6fd972a4d0e285030b97.png
  • 读者可分别尝试先不运行showtext_auto()语句和运行后的绘图效果。

x11() 
plot(1:3, ann = F, axes = F, type = "n", frame.plot = T)

## 开始使用
showtext_begin()
text(2,2.5, "宋体", 
     family = "ST", font = 2)
text(2,2, "黑体", 
     family = "heiti", font = 3)
showtext_end() 
## 结束使用

text(2,1.5, "constan", 
     family = "constan", font = 4)
  • 上述语句在运行到最后一句时,会报以下错误:
    Warning message: In text.default(2, 1.5, "constan", family = "constan", font = 4) :
    Windows字体数据库里没有这样的字体系列

关于showtext工具包更多的介绍可参见作者提供的如下学习材料:

  • https://mirrors.tuna.tsinghua.edu.cn/CRAN/web/packages/showtext/vignettes/introduction.html

  • https://journal.r-project.org/archive/2015-1/qiu.pdf

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

showtext 的相关文章

  • 在 Java 和 PHP 之间加密/解密字符串

    我使用 AES 加密来加密和解密服务器端的 php 和 Android 应用程序 作为客户端 之间的字符串 PHP 中的加密字符串为 HaxRKnMxT24kCJWUXaVvqDHahzurJQK sYA4lIHql U 在 Java 中是
  • 让 Java 与 Windows 10 Ubuntu 一起使用

    我安装了 Windows 10 周年更新 以便可以在 Windows 上的 Ubuntu 上尝试 Bash 看如何安装 http www howtogeek com 249966 how to install and use the lin
  • 使用 javax.mail 和 CentOS 的邮件服务器

    我有一个 Java 程序 安装在一台旧的 Ubuntu 机器上 并使用 javax mail 发送邮件 然而 那台机器宕机了 我现在在新的 CentOS 机器上运行相同的 Java 应用程序 但是 当我尝试使用 mail smtp host
  • 序言中不允许引用

    请帮我找到这个异常的原因 我使用以下罐子 core renderer jar itext paulo 155 jar 第一个文档 xhtml lt xml version 1 0 encoding UTF 8 gt lt DOCTYPE h
  • Java反序列化中避免重复对象

    我有两个列表 list1 和 list2 其中包含对某些对象的引用 其中某些列表条目可能指向同一对象 然后 由于各种原因 我将这些列表序列化为两个单独的文件 最后 当我反序列化列表时 我想确保我不会重新创建超出需要的对象 换句话说 List
  • 我以为 Python 通过引用传递了所有内容?

    采取以下代码 module functions py def foo input new val input new val module main py input 5 functions foo input 10 print input
  • 在Java中一个接一个地播放WAV文件

    我正在尝试玩几个WAV http en wikipedia org wiki WAV文件一个接一个 我尝试了这个方法 for String file audioFiles new AePlayWave file start 但这会同时播放它
  • 在IPython笔记本中自动播放声音

    我经常在 IPython 笔记本中运行长时间运行的单元 我希望笔记本在单元完成执行时自动发出蜂鸣声或播放声音 有没有办法在 iPython 笔记本中执行此操作 或者我可以在单元格末尾放置一些命令来自动播放声音 我正在使用 Chrome 如果
  • 连接 Flask Socket.IO Server 和 Flutter

    基本上 我有一个套接字 io 烧瓶代码 import cv2 import numpy as np from flask import Flask render template from flask socketio import Soc
  • 确定 pyInstaller 生成的 Python EXE 中的应用程序路径

    我有一个驻留在单个 py 文件中的应用程序 我已经能够让 pyInstaller 将其成功捆绑到 Windows 的 EXE 中 问题是 应用程序需要一个 cfg 文件 该文件始终直接位于应用程序旁边的同一目录中 通常 我使用以下代码构建路
  • 为什么我只能在异步函数中使用await关键字?

    假设我有这样的代码 async def fetch text gt str return text async def show something something await fetch text print something 这很
  • 当相应的 JTextfield 为空时,如何填充 JTable 中的所有项目

    我正在 Java 项目中设计一个高级搜索选项sqlite在 NetBeans 中 有5种不同JTextfields和 5 列 我想填充JTable具有相应的匹配标准 如果一个JTextfield为空 那么它应该选择该列的所有项目 我使用的查
  • 使用 python pyad 访问对象 [] 时出现问题

    我在尝试使用 pyad 访问活动目录用户属性时遇到问题 这是我的代码 user pyad aduser ADUser from cn tuser print user get attribute lastLogonTimestamp 这些是
  • WTforms 表单未提交但不输出验证错误

    我正在尝试使用以下方式上传文件flask uploads工作和遇到一些障碍 我会告诉你我的flask查看函数 html 希望有人能指出我缺少的内容 基本上发生的情况是我提交了表格但失败了if request method POST and
  • 将 PySpark RDD 作为新列添加到 pyspark.sql.dataframe

    我有一个 pyspark sql dataframe 其中每一行都是一篇新闻文章 然后我有一个 RDD 来表示每篇文章中包含的单词 我想将单词的 RDD 作为名为 单词 的列添加到我的新文章数据框中 我试过 df withColumn wo
  • Google OR-Tools:无法运行 java 示例,java.lang.UnsatisfiedLinkError:java.library.path 中没有 jniortools

    我是java新手 我想尝试google or tools来解决车辆路由问题 只是尝试运行 java 示例here https developers google com optimization introduction run progr
  • 仅在java中使用数组计算50的阶乘

    我是java的初学者 我有一个作业要编写一个完整的程序 使用数组计算 50 的阶乘 我无法使用像 biginteger 这样的任何方法 我只能使用数组 因为我的教授希望我们理解背后的逻辑 我猜 然而 他并没有真正教我们数组的细节 所以我在这
  • 在 kivy 中嵌套小部件

    我正在尝试在 kivy 中制作一个界面 我认为即使在完成教程之后 我仍然不了解自定义小部件以及如何对它们进行层次结构的一些基本知识 我认为我有更多的盒模型 html 思维方式 因此小部件嵌套在本机 GUI 中的方式对我来说仍然有点陌生 一些
  • 如何使用自定义转换器访问 jOOQ 生成的例程字段作为值?

    我在访问生成例程的字段时遇到问题PL pgSQL 用户定义函数 返回JSON 数据类型结果 已经提到this https stackoverflow com q 62535195 6805866问题 这是我的结果get all orders
  • 使用自定义层运行 Keras 模型时出现问题

    我目前正在攻读学士学位论文FIIT STU https www fiit stuba sk en html page id 749 其主要目标是尝试复制和验证以下结果study http arxiv org abs 2006 00885 这

随机推荐

  • python人狗大战游戏_day23 python学习 类 人狗大战

    面向过程 VS 面向对象 面向过程的程序设计的核心是过程 流水线式思维 过程即解决问题的步骤 面向过程的设计就好比精心设计好一条流水线 考虑周全什么时候处理什么东西 面向过程 优点是 极大的降低了写程序的复杂度 只需要顺着要执行的步骤 堆叠
  • 【数字调制】数字调制技术FSK与PSK分析与研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 上世纪 50 年代末 出现了 FSK 与二
  • nodejs安装及一些问题

    安装 nodejs 官方地址 https nodejs org zh cn 跟着一直下一步 中途改一下安装位置 最后 安装完毕后 用node v测试 如果没找到批处理文件 那么就手动检查下以下几个地方 2 更改缓存的位置 之后我们要找到np
  • java: create pdf using itextpdf 5.2.1 Library

    版权所有 2021 涂聚文有限公司 许可信息查看 描述 数据库 Ms SQL server 2019 IDE Eclipse IDE for Enterprise Java and Web Developers 2021 09 OS Win
  • python建包,导包

    查找Python模块的存储位置 Python会从下面的路径中搜索有没有对应的模块 一般来说 模块最佳存放路径是site packages 如果以上路径没有相关模块 那么就会导入失败 解决办法 将该模块所在路径加入sys path中 3 创建
  • ImageView/TextView内容无法动态更新问题

    今天在添加功能的过程中遇到了一个ImageView及TextView在收到回调的内容后 通过handler sendEmptyMessageDelayed COMPLETED 100 在handleMessage方法里做tv settext
  • 04---------Git查看某一个文件的历史提交信息

    一 查看提交记录 1 git log git log 命令是查看全部提交日志 git log p 查看历史纪录以来哪几行被修改 git log oneline 查看历史提交日志 单行显示 git reflog 跟git log 一样 2 g
  • 计算机中丢失MSVCR120.dll,找不到MSVCR120.dll怎么办呢?

    MSVCR120 dll是Windows操作系统的一个动态链接库文件 它是Microsoft Visual C 库的一部分 主要用于程序运行时的内存管理 异常处理和安全功能 这个库最初是为了开发Windows应用程序而设计的 可以为程序员提
  • pip与pip3的大概区别

    这里就简单给大家说明一下喽 我们知道python 有python2和python3的区别 那么当然pip也有pip和pip3的区别 pip是python的包管理工具 pip和pip3版本不同 都位于python的Scripts目录下 如图
  • selenium基础入门

    2020年的selenium比2015年进步了太多 稳定性和操控性都变好了 selenium是基于webdriver协议 几个概念 selenium webdriver chromedriver chrome chrome可以作为浏览器代表
  • sakila数据库介绍

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题 有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中 居左 居右 Sma
  • Spring IOC容器启动源码分析文字版

    Spring容器的refresh 创建刷新 1 prepareRefresh 刷新前的预处理 1 initPropertySources 初始化一些属性设置 子类自定义个性化的属性设置方法 2 getEnvironment validate
  • java字符串大写转小写,小写转大写

    JAVA中String类提供了转大写的方法toUpperCase 和转小写的方法toLowerCase 使用如下 String a ABC system out println a toLowerCase abc String b abc
  • Hive

    hive是基于Hadoop的一个数据仓库工具 可以将结构化的数据文件映射为一张数据库表 并提供简单的sql查询功能 可以将sql语句转换为MapReduce任务进行运行 其优点是学习成本低 可以通过类SQL语句快速实现简单的MapReduc
  • cnpm、vue、vue-cli全局安装

    cnpm安装
  • ESP-NOW无线通信

    本文由铁熊与默联合创作 在学习 Arduino 开发的过程中 无线通讯是我们学习道路上一道必过的坎 无线通讯摆脱了线材的束缚 使用更加灵活且通讯距离根据不同无线模块可达几十米甚至是数公里 常见的无线通讯方式有蓝牙 WiFi LoRa NB
  • C++十种排序方法(快速排序、冒泡排序等等)

    C 十种排序方法 快速排序 冒泡排序等等 一 冒泡排序 1 概念及思路 冒泡排序顾名思义就是大的数沉下去 小的数浮上来 就跟气泡在水底浮上来一样 基本的思路很简单 就是相邻的两个数相比较 如果前面那个数比后面那个数大 则换位置 否则不需要换
  • innodb下的mvcc_浅谈MVCC

    简介 MVCC Multi Version Concurrency Control 即多版本并发控制 MVCC的实现原理 我们在了解MVCC之前 首先先了解一下几个比较常见的锁 读锁 也叫共享锁 S锁 若事务T对数据对象A加上S锁 则事务T
  • APISIX-dashboard安装篇

    一 简介 apisix dashboard是官方提供的web图形界面 可以方便的添加组件以及配置服务 适合我这种咸鱼使用 项目地址 https github com apache apisix dashboard 二 安装 本文使用rpm的
  • showtext

    R语言绘图的字体设置是个老大难的问题 它默认情况下只提供三种字体 本篇推文介绍两种字体设置方法 针对Windows系统 一种是R语言本身的字体设置方法 另一种是showtext等工具包提供的相关方法 1 系统设置方法 1 1 原生样式 R语