【问题标题】:Installing fonts so that R postscript() device can recognise them安装字体以便 R postscript() 设备可以识别它们
【发布时间】:2019-12-20 10:31:38
【问题描述】:

根据this 帖子中的建议,我正在尝试将衬线字体(或字体“系列”)安装到 R 中,以便可以将 ggplots 保存为 .eps 文件。虽然提供的建议有效,但我想尝试解决该问题以供将来使用。

这是生成问题的代码。

library(bayesplot)
df <- data.frame(xVar = rnorm(1e4,0,1), yVar = rnorm(1e4,2,1), zVar = rnorm(1e4,4,1))
t <- bayesplot::mcmc_trace(df) 
t

现在当我去保存图时,我得到了这个错误

ggplot2::ggsave(filename = "tPlot.eps", 
                plot = t, 
                device = "eps", 
                dpi = 1200, 
                width = 15,
                height = 10, 
                units = "cm")

哪个会引发错误

Error in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)) : 
  family 'serif' not included in postscript() device

在上一篇文章中,回答者建议我下载extrafont 包。

我跑了

View(fonttable())

但似乎没有安装衬线字体。

然后我尝试了

font_addpackage(pkg = "serif")

但我得到了错误

Error in font_addpackage(pkg = "serif") : 
  Unknown font package type: not type1 or ttf.

有谁知道如何安装衬线字体以便 R 可以识别/使用它?

【问题讨论】:

  • Serif 不是字体,它是一种字体可能有或没有的功能。
  • @Rui Barradas 你是对的,但我复制到帖子中的错误消息似乎表明 R 认为它是一个“家庭”,无论这意味着什么。你有什么安装技巧吗?
  • 我不会像你一样解释错误信息。我认为这意味着 "serif" 不被识别为字体类型。但是extrafont 包中有 458 种衬线字体,尝试fnt &lt;- fonts();i &lt;- grep("serif", fnt, ignore.case = TRUE);fnt[i] 有一个它们名称的向量。
  • 谢谢@Rui Barradas。我使用了您的代码并得到了[1] "Microsoft Sans Serif" "MS Reference Sans Serif",我收集到的不是衬线字体。虽然 Times New Roman 是一种衬线字体,当我这样做时 View(fonttable()) Times New Roman 就在那里,但我仍然收到该错误消息。 View(fonttable()) 也只返回 81 个字体名称。我对加载、嵌入和安装字体之间的区别感到非常困惑。如何安装您提到的 458 字体以便 R 可以识别它们?
  • 你读过包裹documentation吗?

标签: r ggplot2 fonts extrafont


【解决方案1】:

使用包extrafont 必须先安装字体,然后才能将其提供给用户。这是通过函数font_import 完成的。

library(extrafont)

font_import()    # This takes several minutes

现在我们可以查看已安装和可用的字体。来自文档,help("fonts")

说明

显示在字体表中注册的字体(并且可以嵌入)

fonts_installed <- fonts()

serif1 <- grepl("serif", fonts_installed, ignore.case = TRUE)
sans1 <- grepl("sans", fonts_installed, ignore.case = TRUE)

fonts_installed[serif1 & !sans1]

sum(serif1 & !sans1)
#[1] 458

有 458 种字体可用。
查看字体表的另一种方法是使用函数fonttable,但返回的字体不一定可用于嵌入。来自help("fonttable")

说明

返回完整的字体表

请注意,该函数返回一个数据帧,因此在下面调用str(省略输出)。

df_font <- fonttable()
str(df_font)

serif2 <- grepl("serif", df_font$FontName, ignore.case = TRUE)
sans2 <- grepl("sans", df_font$FontName, ignore.case = TRUE)

df_font$FontName[serif2 & !sans2]

最后看看绘图功能是否可以在 postscript 设备上工作。

library(bayesplot)

df <- data.frame(xVar = rnorm(1e4,0,1), yVar = rnorm(1e4,2,1), zVar = rnorm(1e4,4,1))
p <- bayesplot::mcmc_trace(df)
p

ggplot2::ggsave(filename = "tPlot.eps", 
                plot = p, 
                device = "eps", 
                dpi = 1200, 
                width = 15,
                height = 10, 
                units = "cm")

【讨论】:

    猜你喜欢
    • 2018-04-18
    • 1970-01-01
    • 2013-11-09
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 2011-09-21
    • 1970-01-01
    相关资源
    最近更新 更多