r - 如何在 R Markdown 中使用 Cairo PNG

标签 r ggplot2 r-markdown knitr 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)

使用 cairo_pdf使用 knitr 在 R Markdown 中的设备也很容易—添加 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
```

PDF output

使用基于开罗的 PNG 也有优势,因为 Cairo correctly deals with DPI .如果将正常保存的高DPI的PNG放入Word或PowerPoint文件中,图的尺寸被夸大,不准确。如果将具有相同高 DPI 的基于开罗的 PNG 放入 Word,则尺寸是正确的:

Weird Word dimensions

使用 ggsave() 将 ggplot 输出保存为高分辨率开罗 PNG 很容易,但语法与另存为开罗 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"编织时,但复制此 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
```

总之,我正在寻找一种方法来使用您从 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更改特定设备类型的选项(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"))
})

我现在已经在几个文档中使用了它。 备注 : 我只将它用于做 rmarkdown::render(...) 的文档从 R 命令行。

关于r - 如何在 R Markdown 中使用 Cairo PNG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55009313/

相关文章:

r - ggplot2如何使散点图上的水平和垂直误差条具有相同大小且具有不同比例的轴

r - 如何使用 R 的 ggplot2 编辑圆环图的标签?

r - 如何在不获取另一个(无用)图例的情况下调整 geom_line 中的线条大小?

r - 如何为具有R减价的数据帧的每个子集创建不同的报告?

r - 为什么 select.files() 不在当前工作目录中打开?

r - 使用 ggplot2 根据 y 值更改线条颜色

r - Knit 无法编译 PDF : "Error in tools::file_path_as_absolute(output_file)"

r - 将迷你图添加到表中

r - 如何让 openBLAS 与 openMP 一起工作?

r - 如何为tableGrob图添加标题?