使用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)
在R Markdown中通过knitr使用
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开始,使用基于Cairo的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中。编织时使用knitr会很好,但是在R Markdown中复制此
type = "cairo"
会更困难。开罗库包含诸如dpi = 300, type = "cairo"
之类的设备,但是Cairo::CairoPNG()
不使用此设备。它使用R的标准PNG设备,但已启用Cairo支持。通过在块选项中添加
ggsave(..., type = "cairo")
来使图形更高分辨率非常容易,但是我无法让knitr使用启用了dpi=300
的内置PNG设备。我尝试过天真地将type = cairo
添加到YAML元数据中,但这并不奇怪。 knitr生成的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中
type: cairo
相同的输出的方法。有没有办法做到这一点?---
title: "Something"
output:
pdf_document:
dev: cairo_pdf # yay Cairo output
html_document: # What needs to go here?
dev: png
type: cairo
---
最佳答案
使用knitr
选项,而不是YAML标头。
您可以使用knitr
选项更改特定设备的类型(Yihui的建议):
knitr::opts_chunk$set(dev.args = list(png = list(type = "cairo")))
或者,您可以根据输出有条件地执行此操作:
if (!knitr::is_latex_output()) {
knitr::opts_chunk$set(dpi = 300, dev.args = list(type = "cairo"))
})
我已经在几个文档上使用了。注意:我仅将其用于从R命令行执行
rmarkdown::render(...)
的文档。关于r - 如何在R Markdown中使用Cairo PNG,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55009313/