使用Cairo保存R图形有许多优点(例如,请参见此处)。例如,在保存PDF时,
对于基于ggplot的图形,使用
将该文件放入Word或PowerPoint中,一切都按高分辨率正确缩放。
当转换为HTML或Word时,这种尺寸误解会延续到R Markdown中。如果在编织时使用
通过将
cairo_pdf
设备可以正确地嵌入自定义字体。对于基于ggplot的图形,使用
ggsave()
很容易使用cairo_pdf
图形设备: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)
使用 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
```
使用基于Cairo的PNG也有优势,因为Cairo可以正确处理DPI。如果您将一个通常保存的高DPI PNG放入Word或PowerPoint文件中,则图形的尺寸会被夸大且不准确。如果您将一个基于Cairo的相同高DPI 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库包括像Cairo :: CairoPNG()
这样的设备,但是ggsave(...,type = "cairo")
不使用此设备。它使用了R的标准PNG设备,但打开了Cairo支持。通过将
dpi = 300
添加到块选项中,使图形具有高分辨率很容易,但我无法让knitr使用内置的PNG设备并启用type = cairo
。我尝试在YAML元数据中天真地添加type:cairo
,但毫不奇怪地它不起作用。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
---
dev.args
而不仅仅是dev
,就像我下面的回答一样吗? - rmflight