Как использовать Каирские PNG в R Markdown - PullRequest
9 голосов
/ 05 марта 2019

Использование 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)

Использование устройства 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
```

PDF output

Существуют также преимущества использования PNG на основе Каира, поскольку Каир правильно работает с DPI . Если вы поместите нормально сохраненный файл PNG с высоким DPI в файл Word или PowerPoint, размеры рисунка преувеличены и не точны. Если вы поместите PNG на основе Каира с тем же высоким разрешением в Word, размеры будут правильными:

Weird Word dimensions

Сохранение вывода ggplot в формате PNG с высоким разрешением Cairo легко с ggsave(), но синтаксис немного отличается от сохранения в Cairo PDF. Вместо указания устройства мы указываем тип:

ggsave(ugly_plot, filename = "ugly_plot.png", 
       width = 4, height = 2.5, dpi = 300, type = "cairo")

Помещение этого файла в Word или PowerPoint прекрасно работает, и все отображается правильно с высоким разрешением.

Эта неправильная интерпретация размеров переносится в R Markdown при вязании в HTML или Word. Было бы здорово использовать knitr type = "cairo" при вязании, но воспроизвести этот dpi = 300, type = "cairo" в R Markdown, однако, сложнее. Библиотека Cairo включает такие устройства, как Cairo::CairoPNG(), но ggsave(..., type = "cairo") не использует это устройство. Он использует стандартное устройство PNG R, но с включенной поддержкой Cairo.

Сделать высокое разрешение рисунка достаточно просто, добавив dpi=300 к параметрам чанка, но я не могу заставить knitr использовать встроенное устройство PNG с включенным type = cairo. Я попытался наивно добавить type: cairo к метаданным YAML, но неудивительно, что это не работает. PNG, который генерирует knitr, не использует 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") в knitr. Есть ли способ сделать это?

---
title: "Something"
output:
  pdf_document:
    dev: cairo_pdf  # yay Cairo output
  html_document:  # What needs to go here?
    dev: png
    type: cairo
---

1 Ответ

8 голосов
/ 05 марта 2019

Вместо того, чтобы пытаться сделать это в заголовке yaml, условно сделайте это в блоке установки.

if (!knitr::is_latex_output()) {
  knitr::opts_chunk$set(dpi = 300, dev.args = list(type = "cairo"))
})

Я уже использовал это в паре документов. Примечание : я использовал это только для документов, выполняющих rmarkdown::render(...) из командной строки R.

...