在函数内调用时使用png函数不起作用

时间:2012-02-09 06:00:10

标签: r plot ggplot2

我有一个功能可以完成任务,然后根据条件进行绘图:

f <- function(n) {
  rand <- rnorm(n)
  no   <- seq_len(n)
  df   <- data.frame(no=no, rand=rand)
  if (n > 10) {
    png("plot.png")
    p <- ggplot(df)
    p + geom_point(aes(x=no, y=rand))
    dev.off()
  }
}

f(11)

我在这结尾处得到一个空白的png文件。这是怎么回事?

2 个答案:

答案 0 :(得分:17)

根据回复,这里有两个解决方案:

library(ggplot2)
f <- function(n) {
  rand <- rnorm(n)
  no   <- seq_len(n)
  df   <- data.frame(no=no, rand=rand)
  if (n > 10) {
    png("plot.png")
    print({
      p <- ggplot(df)
      p + geom_point(aes(x=no, y=rand))
    })
    dev.off()    
  }
}

f(11)

注意:我知道我需要使用print(),但我尝试这种方式的方式不起作用,因为它没有放在正确的位置。

另外,我之前尝试过ggsave选项,但这也没有用。当然,它现在也可以。它似乎比使用png()具有更好的分辨率:

library(ggplot2)
f <- function(n) {
  rand <- rnorm(n)
  no   <- seq_len(n)
  df   <- data.frame(no=no, rand=rand)
  if (n > 10) {
    p <- ggplot(df)
    p + geom_point(aes(x=no, y=rand))
    ggsave(file="plot.png")
  }
}

f(11)

谢谢大家。

答案 1 :(得分:10)

我刚从其他网站(下面提供的链接)了解到。在循环中,您必须显式使用print函数才能使jpeg(),png()函数起作用。 在原始帖子中,您只需添加一行打印(p)。

  if (n > 10) {
        png("plot.png")
        p <- ggplot(df)
        p + geom_point(aes(x=no, y=rand))
        print(p)
        dev.off()
    }

在下面的链接中,它为此提供了一个很好的解释 https://stat545-ubc.github.io/block017_write-figure-to-file.html#despair-over-non-existent-or-empty-figures