是否可以使用 Cairo 图形设备使用 ggsave 创建 .eps 文件?
Is it possible to create .eps files with ggsave using the Cairo graphics device?
编辑:本页提供代码: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 文件?如果是,怎么做?
您可以使用
保存到 EPS
ggsave("model.eps", device = "eps")
您需要查看以了解差异的代码位于 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 会根据提供的文件名的扩展名从一个命名的函数列表中调度作为 "filename"。 type 参数被传递给 png
函数以使用 png
的 'cairo' 版本而不是默认版本。
这是可能的设备及其默认参数的列表。可以为这些默认值提供替代值,并且 "dots" 可用于指定其他设备参数。 (有关详细信息,请参阅各自的帮助页面):
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")
TL;DR
您需要调用特定的 pdf 和 ps cairo 设备,而标准 png 设备可以设置为使用其自己的类型参数生成 cario 输出。
说明
ggsave
的 device
参数可以采用设备功能,匹配预定义列表之一的字符串,或者保留为 NULL
(在这种情况下设备是从文件扩展名猜测)。在任何情况下,都会调用一个设备函数。请注意,在使用函数形式时,您可能需要设置一些参数,如果您使用字符形式或自动检测形式,ggsave
会为您设置这些参数。
包含大多数默认使用的设备的 grDevices
包还有 cario_pdf
和 cairo_ps
设备,您可以将它们传递给 ggsave
。
没有cairo_png
设备。但是,png
设备有一个 type
参数,它从以下向量中获取选项(至少在 Windows 上):c("windows", "cairo", "cairo-png")
。 ggsave
在调用时将 type
规范传递给 png
设备。
编辑:本页提供代码: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 文件?如果是,怎么做?
您可以使用
保存到 EPSggsave("model.eps", device = "eps")
您需要查看以了解差异的代码位于 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 会根据提供的文件名的扩展名从一个命名的函数列表中调度作为 "filename"。 type 参数被传递给 png
函数以使用 png
的 'cairo' 版本而不是默认版本。
这是可能的设备及其默认参数的列表。可以为这些默认值提供替代值,并且 "dots" 可用于指定其他设备参数。 (有关详细信息,请参阅各自的帮助页面):
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")
TL;DR
您需要调用特定的 pdf 和 ps cairo 设备,而标准 png 设备可以设置为使用其自己的类型参数生成 cario 输出。
说明
ggsave
的 device
参数可以采用设备功能,匹配预定义列表之一的字符串,或者保留为 NULL
(在这种情况下设备是从文件扩展名猜测)。在任何情况下,都会调用一个设备函数。请注意,在使用函数形式时,您可能需要设置一些参数,如果您使用字符形式或自动检测形式,ggsave
会为您设置这些参数。
包含大多数默认使用的设备的 grDevices
包还有 cario_pdf
和 cairo_ps
设备,您可以将它们传递给 ggsave
。
没有cairo_png
设备。但是,png
设备有一个 type
参数,它从以下向量中获取选项(至少在 Windows 上):c("windows", "cairo", "cairo-png")
。 ggsave
在调用时将 type
规范传递给 png
设备。