如何使用相同的函数使用 ggplot 制作多个图?

How to use make multiple plots with ggplot using the same function?

我想使用 ggplot 绘制一系列图表,然后使用 grid.arrange 堆叠它们。问题是 ggplot 在调用 grid.arrange 之前不会 "use" 提供的数据,这迫使我将数据存储在 .GlobalEnv 中,我无法弄清楚如何避免名称冲突。用 MWE 来说明:

library(ggplot2)
library(gridExtra)

plot.one.graph <- function(data)
{
    p <- ggplot(data, aes(x = category, y = value))
    p <- p + geom_bar(alpha = 0.5, stat = "identity")

    se.minus <- data$value - 1  # fake error bar
    se.plus <- data$value + 1
    assign("se.minus", se.minus, globalenv())
    assign("se.plus", se.plus, globalenv())
    p <- p + geom_errorbar(aes(ymin = se.minus, ymax = se.plus))

    return(p)
}

data.list <- list(  data.frame(category = 1:10, value = rnorm(10, 5)),
                    data.frame(category = 1:10, value = rpois(10, 5)))

ps <- list()
for (i in 1:len(data.list)) {
    ps[[i]] <- plot.one.graph(data.list[[i]])
}
grid.arrange(ps[[1]], ps[[2]])

这里我有两个 data.frame,我想将它们一个接一个地绘制。输出看起来像这样 。因为后一个循环覆盖了第一个循环的(假)错误条数据,所以第二张图的错误条是正确的,但第一张图是错误的。我尝试了多种将变量存储在 .GlobalEnv 中的方法,但似乎没有任何效果。有什么建议吗?

您可以 return 从绘图函数中构建 grob,从而避免需要 .GlobalEnv:

library(ggplot2)
library(gridExtra)

plot.one.graph <- function(data) {

    p <- ggplot(data, aes(x = category, y = value))
    p <- p + geom_bar(alpha = 0.5, stat = "identity")

    data$ymin <- data$value - 1
    data$ymax <- data$value + 1

    p <- p + geom_errorbar(data=data, 
                           aes(ymin = ymin, ymax = ymax))

    p <- p + ylim(0,11)

    return(ggplotGrob(p))

}

set.seed(1492)
data.list <- list(data.frame(category = 1:10, value = rnorm(10, 5)),
                  data.frame(category = 1:10, value = rpois(10, 5)))

ps <- lapply(data.list, plot.one.graph)

do.call(grid.arrange, c(ps, ncol=2))

我添加了一个 set.seed 所以你会在你的系统上得到相同的结果。此外,我更改了绘图生成方式的循环,并使用 do.call 进行最终渲染。我只做了一个水平布局并添加了一个 ylim 所以更容易看出误差线实际上是不同的。