【问题标题】:Is it possible to create .eps files with ggsave using the Cairo graphics device?是否可以使用 Cairo 图形设备使用 ggsave 创建 .eps 文件?
【发布时间】:2018-02-01 16:25:43
【问题描述】:

编辑:此页面提供代码: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 文件?如果有,怎么做?

【问题讨论】:

  • 您尝试过这里的建议吗? stackoverflow.com/questions/4001316/…
  • 能否请您说明使用 Cairo 设备对您的重要性?使用device = "eps"有缺点吗?
  • 我更喜欢 Cairo,因为它支持抗锯齿。

标签: r ggplot2 cairo eps


【解决方案1】:

您需要查看以了解差异的代码位于 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 的逻辑是首先检查“设备”值是否作为函数名给出,如果是则调用该函数。这就是您提供的前两个电话中发生的情况。如果它不是一个函数并且没有给出“设备”的字符值(这是您第三次调用中的情况),那么 plot_dev 根据作为“文件名”提供的文件名的扩展名从一个命名的函数列表中分派。 type 参数被传递给 png 函数,以使用 png 的“cairo”版本而不是默认版本。

这是可能的设备及其默认参数的列表。可以为这些默认值提供替代值,并且“点”可用于指定其他设备参数。 (具体请参见各自的帮助页面):

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?
  • ggsave 的上下文中看起来不可能,因为a) 会抛出错误,b) 在devices-list 中没有相应的条目,所以不可能有选择驱动了扩展。 (无论如何,系统功能都无法识别“cairo”扩展名。)
  • @00schneider 您可以创建自己的函数包装器到png,默认使用 cario 版本。
  • 谢谢!您知道是否可以使用 ggsave(也可能使用 cairo)生成 wmf 或 emf 文件?那是windows设备吗?
【解决方案2】:

TL;DR

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

说明

ggsavedevice 参数可以采用设备函数、匹配预定义列表之一的字符串,或者保留为NULL(在这种情况下,设备是根据文件扩展名猜测的)。在任何情况下,都会调用设备函数。请注意,在使用函数形式时,您可能需要设置一些参数,如果您使用字符或自动检测形式,ggsave 会为您完成。

包含默认使用的大部分设备的grDevices 包也有cario_pdfcairo_ps 设备,您可以将它们传递给ggsave

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

【讨论】:

  • 谢谢!您知道是否可以使用 ggsave(也可能使用 cairo)生成 wmf 或 emf 文件?那是windows设备吗?
  • 是的,这是可以通过扩展猜测的内置选项之一,或者您可以使用"emf""wmf" 作为设备字符串。不过,默认的win.metafile 设备没有 cairo 选项。
【解决方案3】:

您可以使用

保存到 EPS
ggsave("model.eps", device = "eps")

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
相关资源
最近更新 更多