【问题标题】:How can I check whether a given font has been loaded already using extrafont package in R?如何检查是否已经使用 R 中的 extrafont 包加载了给定的字体?
【发布时间】:2021-11-17 08:24:58
【问题描述】:

我已经编写了一个函数来在同事之间共享图形,我的组织更喜欢 Calibri 而不是 ggplot2 默认 Arial 文本。如果我是唯一会使用此功能的人,我会首先在我的脚本顶部执行此操作:

 library(extrafont)
 font_import()
 loadfonts(device="win")

然后制作我的 ggplot2 图表。我似乎只需要在给定的机器上执行一次font_import(),但是每次开始新会话时我都需要执行loadfonts(device="win")。我不太熟悉这些功能,但如果我不执行 loadfonts 步骤,我的图表就不会使用 Calibri。

我希望我编写的图形函数可以为其他人工作,并且我想检查他们是否已经完成了这些步骤,如果他们还没有,就给他们一个有用的信息不。我以为我可以使用fonts(),然后检查输出中是否列出了Calibri,但我认为这只会检查我在使用这台机器的历史上曾经加载过font_import() 的字体。我也觉得可能

 systemfonts::match_font("Calibri")

会检查,但无论我是否已经运行 loadfonts(...,我都会得到相同的结果,所以也不是这样。

如何检查字体是否可以在图表中使用?

【问题讨论】:

  • 我认为您可以使用 showtext 代替在其他计算机上使用 Calibri 字体,而无需 extrafont::loadfonts 步骤。
  • 试试names(grDevices::windowsFonts())
  • @JonSpring:showtext 是做什么的?是哪个包的?我找不到它。
  • @stefan:这会告诉我是否有衬线、无衬线或单色字体选项,但实际上不会告诉我字体系列。
  • 同意@JonSpring - showtext 是我处理这项任务的方式 - 例如install.packages("showtext"); library(showtext); list_of_fonts <- as.data.frame(font_files()); grep(pattern = "Calibri", x = list_of_fonts$family, ignore.case = TRUE, value = TRUE)

标签: r ggplot2 fonts extrafont


【解决方案1】:

这是确定 Calibri 是否已安装且“可用”的一种潜在方法:

install.packages("showtext")
library(showtext)
list_of_fonts <- as.data.frame(font_files())

grep(pattern = "Calibri", x = list_of_fonts$family, ignore.case = TRUE, value = TRUE)

您可以通过多种方式实现此功能,例如如果 Calibri 字体可用,则加载它;如果系统上不可用,则打印一条消息:

if (!require(showtext)) install.packages("showtext")
#> Loading required package: showtext
#> Loading required package: sysfonts
#> Loading required package: showtextdb
library(showtext)
list_of_fonts <- as.data.frame(font_files())
if(any(grepl("Calibri.ttf", list_of_fonts, ignore.case = TRUE))){
  Calibri <- list_of_fonts[list_of_fonts$file == "Calibri.ttf",]
  sysfonts::font_add(family = "Calibri",
                     regular = list.files(path = Calibri$path,
                                          pattern = "Calibri.ttf",
                                          full.names = TRUE))
  print("Calibri available")
} else{
  print("Calibri not found")
}
#> [1] "Calibri available"

library(ggplot2)
showtext_auto()
ggplot(mtcars, aes(wt, mpg)) +
  geom_point() +
  ggtitle("Example plot") +
  theme(text = element_text(family = "Calibri", size = 22))

reprex package (v2.0.1) 于 2021 年 9 月 29 日创建

注意这应该适用于 windows/macOS/linux,但我只在 macOS 上测试过。另外,@JonSpring 先评论了,所以如果他发布了答案,请接受他的而不是我的

【讨论】:

    猜你喜欢
    • 2021-06-26
    • 2021-12-23
    • 2022-01-01
    • 2013-04-16
    • 1970-01-01
    • 2013-11-22
    • 2012-04-27
    • 2012-08-31
    • 1970-01-01
    相关资源
    最近更新 更多