【问题标题】:How do I export multiple plots as png files from R?如何从 R 将多个图导出为 png 文件?
【发布时间】:2018-01-27 01:02:15
【问题描述】:

我有一个 R 脚本,可以从表格数据创建多个趋势图。我需要将每个图导出为 png 文件。我已经使用 png() 搜索并尝试过(无济于事)。看起来这应该是一个相对容易的解决方法。我的代码如下。有人可以就我如何解决这个困境提供一些建议吗?

library(dplyr)
library(tidyr)
library(readr)
library(ggplot2)
library(magrittr)
library(stringi)
library(lubridate)
library(stats)

#load in datafiles

c_data <- read_csv  ("C:/Projects/A_AX_tech_memo/data_analysis/AAX_data_2017_dtcts.csv")

C_data_out <-
c_data %>%
group_by(METHOD_NAME, STD_CON_LONG_NAME, SAMP_SITE_NAME, FILTERED_FLAG) %>%
ungroup() %>%
select(METHOD_NAME, STD_CON_LONG_NAME, SAMP_SITE_NAME, SAMP_DATE,   STD_VALUE_RPTD, STD_ANAL_UNITS_RPTD, FILTERED_FLAG, STD_REPORTING_LIMIT, STD_REQUIRED_DETECTION_LIMIT, LAB_QUALIFIER) %>%
rename(Method = METHOD_NAME, Constit = STD_CON_LONG_NAME, Well = SAMP_SITE_NAME, Date = SAMP_DATE, Value = STD_VALUE_RPTD, Unit = STD_ANAL_UNITS_RPTD, Filtered = FILTERED_FLAG, MDL = STD_REPORTING_LIMIT, RDL = STD_REQUIRED_DETECTION_LIMIT, Flag =LAB_QUALIFIER) %>%
mutate(Date = mdy(Date))

dfs <- split(C_data_out, with(C_data_out, interaction(Well, Constit, Filtered)), drop = TRUE)

plotz <- lapply(dfs, function(x){
  ggplot(data = x, aes(Date, Value)) +
    geom_point(data = x, aes(color = Flag), size = 3) +
    ggtitle(paste(x$Well, x$Constit, x$Filtered, sep =".")) +
    ylab("ug/L or Pci/L") +
    geom_smooth(method = "lm", se = FALSE, rm.na = TRUE) +
    geom_hline(aes(yintercept=x$MDL, linetype="MDL"), color ="dark green", lwd=1, lty=2) +
    geom_hline(aes(yintercept=x$RDL, linetype="RDL"), color ="purple", lwd=1, lty=2)
})

这是我尝试使用 png 的示例:

names <- lapply(dfs, function(x){
  ggtitle(paste(x$Well, x$Constit, x$Filtered, sep ="."))
})

plotz <- lapply(dfs, function(x){
  mypath <- file.path("C:","plots", paste(names[i], ".png", sep = ""))
  png(file=mypath)
  ggplot(data = x, aes(Date, Value)) +
  geom_point(data = x, aes(color = Flag), size = 3) + 
  ggtitle(paste(x$Well, x$Constit, x$Filtered, sep =".")) +
  ylab("ug/L or Pci/L") +
  geom_smooth(method = "lm", se = FALSE, rm.na = TRUE) +
  geom_hline(aes(yintercept=x$MDL, linetype="MDL"), color ="dark green", lwd=1, lty=2) +
  geom_hline(aes(yintercept=x$RDL, linetype="RDL"), color ="purple", lwd=1, lty=2)
  dev.off()
})

这给了我这个错误:

 Error in paste(names[i], ".png", sep = "") : object 'i' not found 

我们将不胜感激。

【问题讨论】:

  • 错误信息很清楚:i 未定义。也许你的意思是mypath &lt;- file.path("C:","plots", paste(x$Well, x$Constit, x$Filtered, "png", sep = "."))
  • 感谢您的建议。使用它可以生成图,但它们都是空白的。

标签: r png


【解决方案1】:

这个 sn-p 使用 purrr 中的 map 和 walk 函数工作。

mtcars_split <-
  mtcars %>% 
  split(.$cyl) 

paths <- 
  paste0(names(mtcars_split),".png") 

plots <- 
  mtcars_split %>%
  map(~ ggplot(data=.,mapping = aes(y=mpg,x=wt)) + geom_point()) 

pwalk(list(filename=paths,plot=plots),ggsave)

【讨论】:

  • 这很好用,但是在制作第 37 个图之后,它停止并产生错误: seq.default(h[1], h[2], length.out = n) 中的错误:'to ' 必须是有限数
  • 问题可能是图 37 中的 NA 值而不是函数。
  • 就是这样。一旦我解决了这个问题,所有的图都生成了。谢谢!
猜你喜欢
  • 2021-11-10
  • 2016-03-11
  • 1970-01-01
  • 2016-03-01
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
相关资源
最近更新 更多