And*_*rew 10 r cairo ggplot2 knitr r-markdown
使用Cairo保存R图形有很多优点(例如,请参见此处)。例如,保存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)
Run Code Online (Sandbox Code Playgroud)
将cairo_pdf
R Markdown中的设备与knitr一起使用也很容易-添加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
```
Run Code Online (Sandbox Code Playgroud)
使用基于Cairo的PNG也有优势,因为Cairo可以正确处理DPI。如果将具有高DPI的正常保存的PNG放入Word或PowerPoint文件中,则图形的尺寸会被夸大且不准确。如果将具有相同高DPI的基于Cairo的PNG放入Word中,则尺寸是正确的:
使用容易将ggplot输出保存为高分辨率Cairo PNG ggsave()
,但是语法与另存为Cairo PDF略有不同。我们没有指定设备,而是指定类型:
ggsave(ugly_plot, filename = "ugly_plot.png",
width = 4, height = 2.5, dpi = 300, type = "cairo")
Run Code Online (Sandbox Code Playgroud)
将该文件放置在Word或PowerPoint中效果很好,并且所有文件都可以在高分辨率下正确调整大小。
编织为HTML或Word时,对尺寸的这种误解会延续到R Markdown中。type = "cairo"
在编织时使用编织器会很棒,但是dpi = 300, type = "cairo"
在R Markdown中复制它会更加困难。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
```
Run Code Online (Sandbox Code Playgroud)
总而言之,我正在寻找一种方法来使用您ggsave(..., filename = "blah.png", dpi = 300, type = "cairo")
在knitr中获得的相同输出。有没有办法做到这一点?
---
title: "Something"
output:
pdf_document:
dev: cairo_pdf # yay Cairo output
html_document: # What needs to go here?
dev: png
type: cairo
---
Run Code Online (Sandbox Code Playgroud)
rmf*_*ght 11
而不是尝试在yaml标头中执行此操作,而是有条件地在安装程序块中执行此操作。
if (!knitr::is_latex_output()) {
knitr::opts_chunk$set(dpi = 300, dev.args = list(type = "cairo"))
})
Run Code Online (Sandbox Code Playgroud)
我已经在几个文档上使用了。注意:我仅将其用于rmarkdown::render(...)
从R命令行执行的文档。