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)
我一直在努力寻找解决办法。也许不是代码而是其他东西?无论哪种方式,谢谢您的协助。
这里有两个问题:(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)
pdfFonts我\xe2\x80\x99发现使用(和/或)显式注册字体更安全postscriptFonts。
该文档包含一个示例,但也可以看看我的fonts模块。这样,注册新字体就像编写一样简单
fonts$register_font(\'Calibri\')\nRun Code Online (Sandbox Code Playgroud)\n\n在内部,这使用 创建字体规范Type1Font,确保名称设置正确,并调用pdfFonts。
它还确保存在完整的字体规格集(这是使用 完成的extrafont::ttf_import)。
这种方式比使用 为所有字体生成字体规格要快得多font_import,并且它为您提供了更多控制权。