如何在 R Markdown 中使用 Cairo PNG
How to use Cairo PNGs in R Markdown
使用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 的 PNG 也有一些优势,因为 Cairo correctly deals with DPI。如果将具有高 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 在编织时使用 type = "cairo"
会很棒,但是在 R Markdown 中复制这个 dpi = 300, type = "cairo"
更困难。 Cairo 库包括 Cairo::CairoPNG()
等设备,但 ggsave(..., type = "cairo")
不使用此设备。它使用 R 的标准 PNG 设备,但启用了 Cairo 支持。
通过在块选项中添加 dpi=300
可以很容易地使图形成为高分辨率,但是我无法让 knitr 使用启用了 type = cairo
的内置 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 中从 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
---
使用 knitr
选项,而不是 YAML header。
您可以使用knitr
选项来更改特定设备的类型(易辉推荐):
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(...)
的文档。
作为 在每个文件顶部使用一段代码的替代方法,这可以在 shell 包装器或 Makefile
中实现,它使用rmarkdown::render()
的可选参数:
R -e 'rmarkdown::render("foo.Rmd", "pdf_document", output_file="foo.pdf", runtime = "static", output_options = list(dpi = 300, dev.args = list(type = "cairo")))'
使用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 的 PNG 也有一些优势,因为 Cairo correctly deals with DPI。如果将具有高 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 在编织时使用 type = "cairo"
会很棒,但是在 R Markdown 中复制这个 dpi = 300, type = "cairo"
更困难。 Cairo 库包括 Cairo::CairoPNG()
等设备,但 ggsave(..., type = "cairo")
不使用此设备。它使用 R 的标准 PNG 设备,但启用了 Cairo 支持。
通过在块选项中添加 dpi=300
可以很容易地使图形成为高分辨率,但是我无法让 knitr 使用启用了 type = cairo
的内置 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 中从 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
---
使用 knitr
选项,而不是 YAML header。
您可以使用knitr
选项来更改特定设备的类型(易辉推荐):
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(...)
的文档。
作为 Makefile
中实现,它使用rmarkdown::render()
的可选参数:
R -e 'rmarkdown::render("foo.Rmd", "pdf_document", output_file="foo.pdf", runtime = "static", output_options = list(dpi = 300, dev.args = list(type = "cairo")))'