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

knitr在.rnw中打印图形列表

  •  1
  • MYaseen208  · 技术社区  · 6 年前

    我想打印图表列表 .Rnw 是的。想知道如何完成任务。

    \documentclass{article}
    
    
    \begin{document}
    \SweaveOpts{concordance=TRUE}
    
    \begin{figure}[H]
    << label = Plot >>=
    library(tidyverse)
    Ys <- c("disp", "hp", "drat", "wt", "qsec")
    
    Plots <- 
      Ys %>% 
      map(function(y)
        ggplot(data = mtcars, mapping = aes(x = mpg, y = y)) +
          geom_point(aes_string(y = y))
      )
    
    print(Plots)
    @
    \end{figure}
    
    
    \end{document}
    
    3 回复  |  直到 6 年前
        1
  •  2
  •   Iman    6 年前

    尝试:

    \documentclass{article}
    
    \begin{document}
    \SweaveOpts{concordance=TRUE}
    
    << label = Plot >>=
    library(tidyverse)
    Ys <- c("disp", "hp", "drat", "wt", "qsec")
    
    Plots <- 
      Ys %>% 
      map(function(y)
        ggplot(data = mtcars, mapping = aes(x = mpg, y = y)) +
          geom_point(aes_string(y = y))
      )
    
    @
    
    <<results=tex,echo=FALSE, >>=
    
    for(i in 1:length(Plots)){
    file=paste("myfile", i, ".png", sep="")
    png(file, res = 80)
    print(Plots[[i]])
    dev.off()
    cat(  "\\begin{figure}\n\\includegraphics{", file, "}\n\n\\end{figure}\n", sep="")
    }
    @
    
    \end{document}
    

    enter image description here

    切换到 knitr

    四块地合一

    \documentclass{article}
    
    
    \begin{document}
    \SweaveOpts{concordance=TRUE}
    \begin{figure}
    
    << label = Plot , fig=TRUE,results=hide>>=
    library(tidyverse)
    library(gridExtra)
    Ys <- c("disp", "hp", "drat", "wt", "qsec")
    
    plotLlist<-list()
    for (i in 1:length(Ys)) {
      plotLlist[[i]]<- ggplot(data = mtcars,  aes_string(x = "mpg", y = Ys[i])) +
      geom_point(aes_string(y = Ys[i]))
    
    }
    print(grid.arrange(grobs =plotLlist[1:4], nrow = 2))
    
    @
    \end{figure}
    
    
    \end{document}
    

    enter image description here

        2
  •  3
  •   camille    6 年前

    你可以在 purrr::walk 无提示地映射绘图列表并将其保存为 ggsave 是的。 walk2 在两个列表上映射,或 iwalk 映射到列表及其名称上。 移动电源 如果你给打印列表命名,这很简单;我在这里做的方式有点尴尬,但是在野外,比如从一个被拆分的数据帧打印,或者用一个已经有名称的向量打印,可能会有所不同。

    aes_string 用于创建 aes 爱依斯 医生,但我也被提醒了怎么做 this answer .

    我首先命名向量,用它自己的值作为它的名称。然后我映射它并应用一个接受字符串的函数 y 并使用 rlang::sym 是的。这允许我使用tidy eval创建一个裸列名 !!y_sum 是的。

    # https://stackoverflow.com/a/50726130/5325862
    Plots <- Ys %>%
      setNames(., nm = .) %>%
      map(function(y) {
        y_sym <- rlang::sym(y)
    
        ggplot(data = mtcars, aes(x = mpg, y = !!y_sym)) +
          geom_point()
      })
    

    列表中可以按名称访问的一个绘图示例:

    Plots$hp
    

    然后为了保存情节, 移动电源 过度使用名称来创建文件名。可以将其他参数添加到 ggsave公司 ,例如维度和分辨率。

    Plots %>%
      iwalk(~ggsave(filename = sprintf("%s_vs_mpg.png", .y), plot = .x))
    #> Saving 7 x 5 in image
    #> Saving 7 x 5 in image
    #> Saving 7 x 5 in image
    #> Saving 7 x 5 in image
    #> Saving 7 x 5 in image
    

    如果需要,您可以在一个步骤中完成所有操作:映射到一个单独的函数中生成绘图并保存。我采用了将图保存到列表的方法,因为这就是您在问题中所做的,这允许您在文档中提取单个图,而不仅仅是将它们保存为文件。

        3
  •  1
  •   wibeasley    6 年前

    这将在工作目录中创建五个png(这是rnw文件的位置,除非您用类似于 opts_knit$set(root.dir='../../') )

    Ys %>% 
      purrr::iwalk(
        ~ggplot(mtcars, aes_string(x = "mpg", y = .x)) +
            geom_point() +
            ggsave(filename = .y, device = "png")
      )