使用Cairo图形设备,是否可以使用ggsave创建.eps文件?

6
编辑:此页面提供了代码:https://www.andrewheiss.com/blog/2017/09/27/working-with-r-cairo-graphics-custom-fonts-and-ggplot/
ggsave("test_cario.eps", device=cairo_ps)

ggsave("test_cario.pdf", device=cairo_pdf)

然而,我想知道这些命令是从哪里来的。它们不在官方文档中可能设备列表中(https://ggplot2.tidyverse.org/reference/ggsave.html)。cairo_png 不存在;相反,需要使用 type="cairo-png",例如:
ggsave("test_cairo.png", type = "cairo-png")

有人知道为什么这个论点有时是device = "",有时又是type = ""吗?

我尝试了类似于以下的代码

ggsave("model.eps", type = "cairo")

或者
ggsave("model.eps", type = "cairo-ps")
或者
ggsave("model.eps", device = "cairo-ps")
但似乎都不起作用。一般而言,是否可以使用Cairo图形设备在ggsave中创建.eps文件?如果可以,应该如何操作?

你尝试过这里的建议吗?https://dev59.com/CG865IYBdhLWcg3wEaYx - Wimpel
请问您能否澄清使用Cairo设备对您的重要性?使用“device =“ eps ””存在缺陷吗? - Jon Spring
我更喜欢使用Cairo,因为它支持抗锯齿。 - 00schneider
3个回答

3

要理解差异,您需要查看ggplot命名空间中的非导出函数plot_dev中的代码。通过查看ggsave代码,您可以获得此信息。分派到设备的行是:

dev <- plot_dev(device, filename, dpi = dpi)
# Look at that function
getAnywhere(plot_dev)  # not exported, so need getAnywhere
plot_dev 的逻辑是首先检查“device”值是否作为函数名给出,如果是,则直接调用该函数。这就是您提供的前两个调用发生的情况。如果它不是一个函数,并且没有为“device”给出字符值(这是您第三个调用的情况),那么 plot_dev 将根据所提供的文件名的扩展名从命名函数列表中分派。类型参数传递给 png 函数,以使用“cairo”版本的 png 而不是默认版本。
以下是可能设备及其默认参数的列表。这些默认值可以提供替代值,并且可以使用“点”来指定其他设备参数。(有关详细信息,请参见它们各自的帮助页面):
devices <- list(eps = eps, 
                ps = eps, 
     tex = function(filename, ...) 
                    grDevices::pictex(file = filename, ...),
     pdf = function(filename, ..., version = "1.4") 
               grDevices::pdf(file = filename, ..., version = version), 
      svg = function(filename, ...) vglite::svglite(file = filename,  ...), 
     emf = function(...) grDevices::win.metafile(...), 
     wmf = function(...) grDevices::win.metafile(...), 
     png = function(...) grDevices::png(..., res = dpi,
                                       units = "in"), 
     jpg = function(...) grDevices::jpeg(..., res = dpi,
                                         units = "in"), 
     jpeg = function(...) grDevices::jpeg(..., res = dpi,
                                          units = "in"), 
     bmp = function(...) grDevices::bmp(..., res = dpi,
                                      units = "in"), 
      tiff = function(...) grDevices::tiff(..., res = dpi,
                                           units = "in"))

请注意,前两个参数被赋予了eps的值。这是一个内部定义的函数:

eps <- function(filename, ...) {
       grDevices::postscript(file = filename, ..., onefile = FALSE, 
            horizontal = FALSE, paper = "special")

非常感谢您详细的回答。您知道是否可以直接使用'device=""'参数调用cairo吗? - 00schneider
1
在“ggsave”的上下文中似乎不可能,因为a)那样会引发错误,b)在“devices”列表中没有相应的条目,因此无法通过扩展驱动选择。(系统函数也没有识别“cairo”扩展。) - IRTFM
@00schneider,你可以创建自己的函数封装器,以cairo版本作为默认值。 - James
谢谢!您知道是否可以使用ggsave(可能还包括cairo)生成wmf或emf文件吗?那是Windows设备吗? - 00schneider

2

TL;DR

使用ggsave函数时,需要调用特定的pdf和ps cairo设备,而标准的png设备可以通过其自己的类型参数设置为生成cairo输出。

Explanation

ggsavedevice参数可以接受设备函数、与预定义列表匹配的字符字符串或保留为NULL(在这种情况下,设备将从文件扩展名猜测)。无论哪种情况,都会调用设备函数。请注意,在使用函数形式时,您可能需要设置一些参数,如果您使用字符或自动检测形式,ggsave会为您设置这些参数。

grDevices包含大多数默认使用的设备,也有cario_pdfcairo_ps设备可以传递给ggsave

没有cairo_png设备。但是,png设备具有一个type参数,它可以从以下向量中选择选项(至少在Windows上):c("windows", "cairo", "cairo-png")。当ggsave调用png设备时,会传递type规范。


谢谢!您知道是否可以使用ggsave(可能还包括cairo)生成wmf或emf文件吗?那是Windows设备吗? - 00schneider
1
是的,这是其中一个内置选项,可以通过扩展名猜测或使用 "emf""wmf" 作为设备字符串来使用。但默认的 win.metafile 设备没有cairo选项。 - James

0

你可以使用以下方式保存为EPS

ggsave("model.eps", device = "eps")

值得一提的是,可用的图形设备选项在此处有文档记录:https://ggplot2.tidyverse.org/reference/ggsave.html - jimjamslam
1
那是使用Cairo图形设备吗? - 00schneider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接