如何使用相同的函数使用 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
所以更容易看出误差线实际上是不同的。
我想使用 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
所以更容易看出误差线实际上是不同的。