使用Cairo来保存R图形(see here, for example)有很多优点。例如,在保存PDF时,cairo_pdf
设备正确嵌入了自定义字体。
使用cairo_pdf
图形设备很容易使用基于ggplot的图形与ggsave()
:
library(ggplot2)
ugly_plot <- ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point() +
labs(title = "Some data about cars") +
theme_gray(base_family = "Papyrus")
ugly_plot
ggsave(ugly_plot, filename = "ugly_plot.pdf",
width = 4, height = 2.5, device = cairo_pdf)
使用knitr在R Markdown中使用cairo_pdf
设备也很容易将dev: cairo_pdf
添加到YAML前端:
---
title: "Cairo stuff"
output:
pdf_document:
dev: cairo_pdf
---
```{r make-ugly-plot, fig.width=4, fig.height=2.5}
library(ggplot2)
ugly_plot <- ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point() +
labs(title = "Some data about cars") +
theme_gray(base_family = "Papyrus")
ugly_plot
```
从Cairo correctly deals with DPI开始,使用基于开罗的PNG也有优势。如果将具有高DPI的正常保存的PNG放入Word或PowerPoint文件中,则图形的尺寸会被夸大且不准确。如果将具有相同高DPI的基于Cairo的PNG放入Word,则尺寸正确:
使用ggsave()
将ggplot输出保存为高分辨率的Cairo PNG很容易,但语法与保存为Cairo PDF略有不同。我们不是指定设备,而是指定类型:
ggsave(ugly_plot, filename = "ugly_plot.png",
width = 4, height = 2.5, dpi = 300, type = "cairo")
将该文件放在Word或PowerPoint中可以很好地工作,并且所有内容都在高分辨率下正确调整大小。
当编织为HTML或Word时,对尺寸的这种误解会延续到R Markdown中。在编织时让编织者使用type = "cairo"
会很棒,但是在R Markdown中复制这个dpi = 300, type = "cairo"
却更难。开罗图书馆包括Cairo::CairoPNG()
等设备,但ggsave(..., type = "cairo")
不使用此设备。它使用R的标准PNG设备,但打开了Cairo支持。
通过将dpi=300
添加到块选项中,使图形高分辨率很容易,但我无法使用内置的PNG设备启用type = cairo
。我尝试天真地将type: cairo
添加到YAML元数据中,但毫不奇怪的是它不起作用。编织者生成的PNG不使用Cairo并且比预期的要大得多(并且在HTML和Word文档中是巨大的)。
---
title: "Cairo stuff"
output:
html_document:
self_contained: no # to see resulting figure as a file
dev: png
type: cairo # this doesn't do anything
---
```{r make-ugly-plot, fig.width=5, fig.height=3.5, dpi=300}
library(ggplot2)
ugly_plot <- ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point() +
labs(title = "Some data about cars") +
theme_gray(base_family = "Papyrus")
ugly_plot
```
总而言之,我正在寻找一种方法来使用你在knitr中从ggsave(..., filename = "blah.png", dpi = 300, type = "cairo")
获得的相同输出。有没有办法做到这一点?
---
title: "Something"
output:
pdf_document:
dev: cairo_pdf # yay Cairo output
html_document: # What needs to go here?
dev: png
type: cairo
---
而不是尝试在yaml标头中执行它,有条件地在设置块中执行它。
if (!knitr::is_latex_output()) {
knitr::opts_chunk$set(dpi = 300, dev.args = list(type = "cairo"))
})
我现在已经在几个文件中使用了它。注意:我只将它用于从R命令行执行rmarkdown::render(...)
的文档。