R 使用带有图形函数的ggplot

R 使用带有图形函数的ggplot,r,ggplot2,R,Ggplot2,我试着从中得到图形函数的概念,并使用基于ggplot的绘图运行 让我快速回顾一下他们的想法:基本上,这只是一种在打印到文件时增加可读性和结构的方法。不必打开绘图设备,生成绘图,然后使用dev.off()关闭设备,建议的方法是通过定义一个生成图形的函数和另一个将图形写入文件的函数来分隔这两个任务 to.dev <- function(expr, dev, filename, ..., verbose=TRUE) { if (verbose) { cat(sprintf("Cre

我试着从中得到图形函数的概念,并使用基于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")
  }
}
这就像一种魅力,如果你必须为很多数字做这些事情,那就太棒了。但是,它不适用于
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
}
什么也没发生。代码已运行,但没有
figs/ggplot.png
文件

我曾阅读过关于其他用户在全球环境以外的环境中遇到
ggplot
问题的报道,我认为这可能与我的问题有关。但我不知道问题到底是什么


如果能解决此问题,并/或就如何在输出多个图形时编写清晰可读的代码提出其他建议,我将不胜感激。

保存ggplot图形的正确方法是使用
ggsave
。看

如果不想使用
ggsave
,只需将
plot
更改为
print(plot)
。看

i、 e:

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)
}
fig.progressive.ggplot
to.png(fig.progressive(TRUE), "figs/ggplot.png", width = 6, height = 4)
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)
}