我想使用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
,我想把它们一个放在另一个上面。输出看起来像。因为后一个循环会覆盖第一个循环的(假)错误条数据,所以错误条对于第二个图是正确的,但对于第一个图是错误的。我已经尝试了各种方法将变量存储在.GlobalEnv
中,但似乎没有任何效果。有什么建议吗?
答案 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))
我添加了set.seed
,因此您可以在系统上获得相同的结果。此外,我更改了如何生成绘图并使用do.call
进行最终渲染的循环。我只进行了水平布局并添加了ylim
,因此更容易看出错误条实际上是不同的。