使用带有图形函数的ggplot

时间:2015-05-17 21:33:33

标签: r ggplot2

我试图了解数字函数我是从Nice R Code blog得到的,用我的基于ggplot的情节来运行。

让我快速回顾一下他们的想法:基本上它只是一种在绘制文件时增加可读性和结构的方法。不必打开绘图设备,生成绘图然后用dev.off()关闭设备,建议的方法是通过定义生成图形的一个函数和将其写入文件的另一个函数来分离两个任务

to.dev <- function(expr, dev, filename, ..., verbose=TRUE) { 
  if (verbose) {
    cat(sprintf("Creating %s\n", filename))
  }

  dev(filename, ...)
  on.exit(dev.off())
  eval.parent(substitute(expr))
} 

to.png <- function(expr, filename, ..., verbose=TRUE) {
  to.dev(expr, png, filename)
}

fig.progressive <- function(with.trend=FALSE) {
  set.seed(10)
  x <- runif(100)
  y <- rnorm(100, x)
  par(mar=c(4.1, 4.1, .5, .5))
  plot(y ~ x, las=1)
  if ( with.trend ) {
    fit <- lm(y ~ x)
    abline(fit, col="red")
    legend("topleft", c("Data", "Trend"),
           pch=c(1, NA), lty=c(NA, 1), col=c("black", "red"), bty="n")
  }
}

最终我只需要写一行来输出数字:

to.png(fig.progressive(TRUE), "figs/base.png", width = 6, height = 4)

这就像一个魅力,如果你必须为很多数字做这些事情,那就太棒了。但是,它不适用于ggplot。在尝试这样的事情时:

fig.progressive.ggplot <- function(with.trend=FALSE) {
  set.seed(10)
  df.x <- runif(100)
  df.y <- rnorm(100, df.x)
  df <- data.frame(df.x, df.y)
  plot <- ggplot(data = df, aes(x = df.x, y = df.y)) + geom_point()
  if ( with.trend ) {
    plot <- plot + geom_smooth()
  }
  plot
}

然后使用

将其写入设备
to.png(fig.progressive(TRUE), "figs/ggplot.png", width = 6, height = 4)
没有任何反应。代码已运行,但没有figs/ggplot.png文件。

我已经阅读过其他用户在全球环境以外的环境中遇到ggplot问题,并认为这可能与我的问题有关。但我无法弄清楚问题究竟是什么。

我很感激这个问题的解决方案和/或有关如何在输出几个数字时编写干净,可读的代码的其他建议。

1 个答案:

答案 0 :(得分:1)

保存ggplot数字的正确方法是使用ggsave。见http://docs.ggplot2.org/current/ggsave.html

如果您不想使用ggsave,只需将plot更改为print(plot)即可。见http://www.cookbook-r.com/Graphs/Output_to_a_file/

即。 :

fig.progressive.ggplot <- function(with.trend=FALSE) {
  set.seed(10)
  df.x <- runif(100)
  df.y <- rnorm(100, df.x)
  df <- data.frame(df.x, df.y)
  plot <- ggplot(data = df, aes(x = df.x, y = df.y)) + geom_point()
  if ( with.trend ) {
    plot <- plot + geom_smooth()
  }
  print(plot)
}