将ggplot图形保存为PDF,并在r中嵌入字体

将ggplot图形保存为PDF,并在r中嵌入字体,r,ggplot2,fonts,export-to-pdf,R,Ggplot2,Fonts,Export To Pdf,我一直在遵循我在网上找到的建议,将ggplot图保存为PDF格式,但我无法让它正常工作。我正在使用extrafont软件包生成带有Calibri文本的图表,但是我的图表打印出来时没有文本。我不知道我错过了什么。在我的过程中,我没有发现任何错误。希望其他人能帮忙 以下是我使用的代码和流程: library(extrafont) font_import(pattern="[C/c]alibri") loadfonts(device="win") 我在这个时候安装了GhostScript。然后运行以

我一直在遵循我在网上找到的建议,将ggplot图保存为PDF格式,但我无法让它正常工作。我正在使用
extrafont
软件包生成带有Calibri文本的图表,但是我的图表打印出来时没有文本。我不知道我错过了什么。在我的过程中,我没有发现任何错误。希望其他人能帮忙

以下是我使用的代码和流程:

library(extrafont)
font_import(pattern="[C/c]alibri")
loadfonts(device="win")
我在这个时候安装了GhostScript。然后运行以下命令来设置重影脚本位置

Sys.setenv(R_GSCMD = "C:\\Program Files\\gs\\gs9.21\\bin\\gswin64c.exe")
然后,我用ggplot制作了一张名为“图表”的图表。该图表在RStudio中看起来很完美,但在PDF中却不是

ggsave("chart.pdf", plot = chart, width = 6, height = 4)
在这里,我得到的警告显示了如下内容:

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

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

embed_fonts("chart.pdf", outfile="chart_embed.pdf")
不幸的是,在所有这些之后,最终的“嵌入”图表看起来与生成的原始图表没有什么不同,它们都没有任何文本

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

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"))

a我认为您错过了初始化步骤
font\u import()
。请预先警告,执行此命令可能需要更长的时间

首先,您可以通过命令
windowsFonts()
查看可用的字体

$serif
[1] "TT Times New Roman"

$sans
[1] "TT Arial"

$mono
[1] "TT Courier New"
此后,您可以导入
extrafont
库和
loadfonts(device=“win”)
。我还建议在R控制台而不是在RStudio中执行这些命令。我建议这样做,因为在RStudio中使用
font\u import()
导入字体时,可能不会显示
y/n
提示

下面我提供了一个最小的可复制示例

    library(ggplot2)
    library(extrafont)
    font_import()
    # tell where ghostscript is located. This is required for saving the font in pdf
    Sys.setenv(R_GSCMD = "C:\\Program Files\\gs\\gs9.21\\bin\\gswin64c.exe") # I have installed 64-bit version of GhostScript. This is why I've used gswin64c.exe. If you have installed 32-bit version of GhostScript, use gswin32c.exe. Failure to specify the correct installed GhostScript will yield error message, "GhostScript not found"
    # create a plot object
p <- ggplot(mtcars, aes(x=wt, y=mpg)) + 
  geom_point()+
  ggtitle("Fuel Efficiency of 32 Cars")+
  xlab("Weight (x1000 lb)") + ylab("Miles per Gallon") +
  theme_bw()+
  theme(text=element_text(family="ArialMT", size=14))
# show the plot
print(p)
注意


这是唯一一种似乎与
ggsave()
配合使用的
ArialMT
字体。请看这一点。使用任何其他字体保存到pdf时,都会在另一种字体上显示字符。这也是一种for
ggsave
字体,自2013年以来一直没有得到回答。

我发现使用(和/或
postscriptFonts

文档中有一个例子,但也可以看看我的。有了这个,注册一种新的字体就像书写一样简单

fonts$register_font('Calibri')
在内部,这将使用创建字体规范,确保名称设置正确,并调用
pdfFonts

它还确保存在完整的字体度量集(使用
extrafont::ttf_import
完成)


这种方法比使用
font\u import
为所有字体生成字体度量要快得多,而且它给了您更多的控制权。

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

首先,正如其他人提到的,在Windows上,您通常需要运行
extrafont::font\u import()
向R注册许多系统字体,但这可能需要一段时间,并且可能会错过TTF和其他类型的字体。解决方法之一是使用
windowsFonts(name\u of_font\u inside\u R=windowsFont(“name of actual font”))动态将字体加载到R中,而不加载整个数据库。
,如下所示:

windowsFonts(Calibri = windowsFont("Calibri"))
这使得在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

我注意到在ggsave()中更改高度和宽度帮助。现在图表上还有字母,但都是在一个点上键入的。因此,所有字母都是在自己的位置上键入的。例如,标题的所有字母都集中在一个点上,因此单词不可读。这可能是一个大小问题。有人对大小有什么建议吗?您可以在主题上保存一些键入:
theme(text=element\u text(family=“Calibri”),axis.text=element\u text(size=10),axis.title=element\u text(size=15),plot.title=element\u text(hjust=0.5,size=20))
。这很有用。谢谢eipi10!
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
ggsave(p, filename = "whatever.pdf", device = cairo_pdf, 
       width = 4, height = 3, units = "in")