代码之家  ›  专栏  ›  技术社区  ›  Andrew

如何在R Markdown中使用Cairo PNGs

  •  0
  • Andrew  · 技术社区  · 7 年前

    使用Cairo保存R图形有很多优点( see here, for example ). 例如,在保存PDF时 cairo_pdf

    使用 开罗大学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)
    

    开罗大学pdf 在R减价的设备与刀也很容易添加 dev: cairo_pdf

    ---
    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

    使用基于Cairo的png也有好处,因为 Cairo correctly deals with DPI . 如果将通常保存的DPI较高的PNG放入Word或PowerPoint文件中,则图形的尺寸会被夸大且不准确。如果将具有相同高DPI的基于Cairo的PNG放入Word中,则尺寸正确:

    Weird Word dimensions

    将ggplot输出保存为高分辨率Cairo png非常容易 ,但语法与另存为Cairo PDFs略有不同。我们不指定设备,而是指定类型:

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

    当编织到HTML或Word时,这种对维度的错误理解会带入R标记。有刀子用就好了 type = "cairo" dpi = 300, type = "cairo" Cairo::CairoPNG() ,但是 ggsave(..., type = "cairo")

    加上 dpi=300 但是我不能让knitr使用内置的PNG设备 type = cairo type: cairo

    ---
    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
    ---
    
    0 回复  |  直到 7 年前
        1
  •  19
  •   Gregor Thomas    6 年前

    使用 knitr 选项,而不是YAML标题。

    针织衫

    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命令行。

        2
  •  0
  •   DomQ    5 年前

    作为替代 @rmflight's answer 在每个文件的顶部使用一段代码,可以在shell包装器或 Makefile 使用可选参数编织Rmarkdown文件 rmarkdown::render() :

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