簡體   English   中英

如何在 R Markdown 中使用 Cairo PNG

[英]How to use Cairo PNGs in R Markdown

使用 Cairo 保存 R 圖形有很多優點( 例如,請參見此處)。 例如,在保存 PDF 時, cairo_pdf設備會正確嵌入自定義字體。

使用帶有ggsave()的基於cairo_pdf圖形可以輕松使用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)

在 R Markdown 中使用cairo_pdf設備和 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
```

PDF輸出

使用基於開羅的 PNG 也有優勢,因為開羅正確處理 DPI 如果將正常保存的高DPI的PNG放入Word或PowerPoint文件中,圖的尺寸被誇大,不准確。 如果將具有相同高 DPI 的基於開羅的 PNG 放入 Word,則尺寸是正確的:

奇怪的詞尺寸

使用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"會很棒,但是在 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
```

總之,我正在尋找一種方法來使用您從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 標頭。

您可以使用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(...)文檔。

作為使用每個文件頂部的一段代碼替代@rmflight 的答案,這可以在 shell 包裝器或Makefile ,后者使用rmarkdown::render()的可選參數編​​織 Rmarkdown 文件:

R -e 'rmarkdown::render("foo.Rmd", "pdf_document", output_file="foo.pdf", runtime = "static", output_options = list(dpi = 300, dev.args = list(type = "cairo")))'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM