使用R中嵌入的字体将ggplot图形保存为PDF

hmh*_*sen 5 fonts r export-to-pdf ggplot2

我一直在遵循我在网上找到的关于将ggplot图形保存为PDF的建议,但是我不能完全使它工作。我正在使用该extrafont程序包在Calibri中生成带有文本的图表,但是我的图表却没有文本打印。我不知道我在想什么。我在过程中找不到任何错误。希望其他人可以提供帮助。

这是我使用的代码和过程:

library(extrafont)
font_import(pattern="[C/c]alibri")
loadfonts(device="win")
Run Code Online (Sandbox Code Playgroud)

我此时安装了GhostScript。然后运行以下命令来设置GhostScript位置。

Sys.setenv(R_GSCMD = "C:\\Program Files\\gs\\gs9.21\\bin\\gswin64c.exe")
Run Code Online (Sandbox Code Playgroud)

然后,我使用ggplot生成了一个称为“图表”的图表。该图表在RStudio中看起来很完美,但在PDF中却不完美。

ggsave("chart.pdf", plot = chart, width = 6, height = 4)
Run Code Online (Sandbox Code Playgroud)

在这里,我得到警告,显示如下内容:

在grid.Call(C_textBounds,as.graphicsAnnot(x $ label),...:在PostScript字体数据库中找不到字体系列'Calibri'

显然,这些警告应该发生吗?然后我跑...

embed_fonts("chart.pdf", outfile="chart_embed.pdf")
Run Code Online (Sandbox Code Playgroud)

不幸的是,毕竟,最终的“嵌入”图表看起来与生成的原始图表没有什么不同,原始图表都没有任何文字。

如果有帮助,下面是生成图表的代码:

a <- ggplot(data=stats, aes(x=Date))
Chart <- a + geom_point(aes(y=NevadaTotalNonfarmAllEmployees)) + 
      xlab("Date") + 
      ylab("Nonfarm Jobs") + 
      ggtitle("Nevada Total Jobs") + 
      theme(axis.title.x = element_text(size=15, family = "Calibri"),
            axis.title.y = element_text(size=15, family = "Calibri"),
            axis.text.x = element_text(size=10, family = "Calibri"),
            axis.text.y = element_text(size=10, family = "Calibri"),
            plot.title = element_text(hjust=0.5, size=20, family = "Calibri"))
Run Code Online (Sandbox Code Playgroud)

我一直在努力寻找解决办法。也许不是代码而是其他东西?无论哪种方式,谢谢您的协助。

And*_*rew 7

这里有两个问题:(1)将字体加载到R中;(2)使用可与自定义嵌入字体正确配合使用的PDF编写库。

首先,正如其他人提到的那样,在Windows上通常需要运行extrafont::font_import()向R注册许多系统字体,但是这可能要花一些时间,并且可能会错过TTF和其他类型的字体。解决此问题的一种方法是使用,将字体动态加载到R中,而无需加载整个数据库windowsFonts(name_of_font_inside_r = windowsFont("Name of actual font")),如下所示:

windowsFonts(Calibri = windowsFont("Calibri"))
Run Code Online (Sandbox Code Playgroud)

这样一来,在R中就可以访问一种字体windowsFonts()。每次运行脚本时,都必须运行此行-字体加载不会在会话之间持续。加载字体后,即可正常使用:

library(tidyverse)
df <- data_frame(x = 1:10, y = 2:11)

p <- ggplot(df, aes(x = x, y = y)) +
  geom_point() +
  labs(title = "Yay Calibri") +
  theme_light(base_family = "Calibri")
p
Run Code Online (Sandbox Code Playgroud)

已校准

其次,R在Windows和macOS上都内置的PDF书写设备不能很好地处理字体嵌入。但是,R现在包括Cairo图形库,该库可以很好地嵌入字体。您可以在其中指定ggsave()要使用的Cairo设备,这比处理GhostScript要容易得多:

ggsave(p, filename = "whatever.pdf", device = cairo_pdf, 
       width = 4, height = 3, units = "in")
Run Code Online (Sandbox Code Playgroud)


Kon*_*lph 5

pdfFonts我\xe2\x80\x99发现使用(和/或)显式注册字体更安全postscriptFonts。

\n\n

该文档包含一个示例,但也可以看看我的fonts模块。这样,注册新字体就像编写一样简单

\n\n
fonts$register_font(\'Calibri\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

在内部,这使用 创建字体规范Type1Font,确保名称设置正确,并调用pdfFonts。

\n\n

它还确保存在完整的字体规格集(这是使用 完成的extrafont::ttf_import)。

\n\n

这种方式比使用 为所有字体生成字体规格要快得多font_import,并且它为您提供了更多控制权。

\n