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

时间:2015-01-04 05:51:24

标签: r ggplot2

我想使用ggplot绘制一系列图表,然后使用grid.arrange进行堆叠。问题是ggplot在调用grid.arrange之前不会“使用”提供的数据,这迫使我将数据存储在.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,我想把它们一个放在另一个上面。输出看起来像output。因为后一个循环会覆盖第一个循环的(假)错误条数据,所以错误条对于第二个图是正确的,但对于第一个图是错误的。我已经尝试了各种方法将变量存储在.GlobalEnv中,但似乎没有任何效果。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

您可以从绘图函数返回构建的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))

enter image description here

我添加了set.seed,因此您可以在系统上获得相同的结果。此外,我更改了如何生成绘图并使用do.call进行最终渲染的循环。我只进行了水平布局并添加了ylim,因此更容易看出错误条实际上是不同的。