在带有 extrafont 包的 .eps 图中使用 Arial 时出错

Error using Arial in .eps figure with extrafont package

我在 R 中使用 ggplot2 为出版物生成图形,其中所有图形都需要是 .eps 格式,所有字体都需要是 Arial。我一直在关注 this guide 使用 extrafont 包进行此操作。据我了解,行 loadfonts(device = "postscript") 应该使用 postscript 设备注册我导入的所有字体(包括 Arial)。但是当我 运行 我的代码并尝试使用此代码保存我的身材时:

ggplot() + geom_point(aes(x=xvar, y=yvar)) + theme_minimal(base_family = "Arial")
library(extrafont)
font_import()
loadfonts(device = "postscript")
ggsave(filename = "myfile.eps")

我仍然收到此错误:

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

我错过了什么?

而不是extrafont

library(ggplot2)
plot <- ggplot(mtcars, aes(wt, qsec)) + 
  geom_point() + 
  theme(text = element_text(family = "Arial"),
        axis.title = element_text(size = 22))

ggsave(filename = "myfile.eps",plot)

假设您在 Windows OS 上,您也可以使用 showtext 包创建图表。

library(showtext)
## add the Arial font
font.add("Arial", regular = "arial.ttf",
    bold = "arialbd.ttf", italic = "ariali.ttf", bolditalic = "arialbi.ttf")

setEPS()
postscript("some_graph.eps")
showtext.begin() ## call this function after opening a device

ggplot() + geom_point(aes(x=xvar, y=yvar)) +
    theme_minimal(base_family = "Arial")

dev.off()

缺点是不能使用ggsave()函数,而是自己调用设备函数

关于 showtext 包的用法,在 https://github.com/yixuan/showtext 处给出了自述文件。

为了将来参考,我在使用带有 Arial 的 extrafont 时也遇到了问题(但在 Windows 上),结果证明有多种原因。

我收到的错误是:Error in title(...) : metric information not available for this deviceIn title(...) : font metrics unknown for character 0x4dfont width unknown

事实证明,extrafont 需要 ghostscript,从这些错误消息中根本看不清楚。事实上,我安装了 ghostscript,但(至少在我的情况下)它也必须在 Path 环境变量中注册,如所述 here(替换您的版本号)。

即使有了它,似乎也不能使用 names(postscriptFonts())fonttable() 中列出的字体名称。 ArialTimes New Roman(或 TimesNewRomanTimesNewRomanPSMT)对我不起作用,而 ArialMTTimes 可以。我不知道这是为什么,也不知道如何找到有效的名称列表。

我在将 extrafonts 包与 ggsave() 一起用于 eps 文件时也偶然发现了这个问题。我知道这个线程很旧,但也许我的解决方法将来可以帮助其他人。 :)

R 不擅长字体嵌入。然而,R 过去已经包含了 Cairo 图形库(因此你不需要再安装 Cairo 包了!),它可以处理嵌入。要使用 Cairo 图形库保存 .eps,只需使用 cairo_ps 作为 device:

ggsave(filename="Fig1.eps", plot = last_plot(), device = cairo_ps)