ggplot2使用变化变量的多重图

时间:2014-08-11 14:28:06

标签: r ggplot2

我正在尝试使用ggplot2创建多个图,然后使用多色图收集。但是,当我尝试创建X图时,我最终得到了相同图形的X.

我的问题代码几乎归结为此,因为df是数据框

library(ggplot2)

i = 1
j = 2
xVar = df[[i]]
yVar = df[[j]]
plot1 = ggplot(data = df, aes(xVar, yVar)) + geom_point(shape=1)

i = 1
j = 3
xVar = df[[i]]
yVar = df[[j]]
plot2 = ggplot(data = df, aes(xVar, yVar)) + geom_point(shape=1)

multiplot(plot1,plot2, cols=2)

此时plot1等于plot2,我不明白为什么。

我感兴趣的完整代码:

n = 1
columns = colnames(df)
plots = list()

for(i in 3:7)
{
    for(j in (i+1):7)
    {
        if(j < 8 & i < 7) {
        xVar = df[[i]]
        yVar = df[[j]]

        plots[[n]] = ggplot(data = df, aes(x=xVar, y=yVar)) +
                geom_point(shape=1) +
                labs(x=columns[[i]], y=columns[[j]]) +
                theme(axis.title=element_text(size=8))
        n = n + 1
        }
    }
}

multiplot(plotlist = plots, cols=3)

3 个答案:

答案 0 :(得分:3)

这里有很多事情发生。

首先,在调用aes(...)时使用外部变量确实是真的 真的 aes(...)的参数在data=...参数的上下文中进行评估,因此在您的情况下df的上下文中。如果失败,则在全局环境中对其进行评估。所以最好做这样的事情:

gg <- data.frame(x=df[[i]],y=df[[j]])
plots[[n]] = ggplot(data = gg, aes(x,y)) +...

其次,ggplot存储来自aes(...)表达式,并在绘制图表时评估它们(因此,在调用multiplot(...)期间)。您的所有绘图都使用xVar中名为yVaraes(...)的变量。因此,当渲染这些图时,ggplot使用当时存储在那些变量中的任何内容 - 可能来自最后一个绘图定义。这就是为什么你的所有情节看起来都像最后一个。这是另一个答案中对“懒惰评估”的引用。

另一方面,ggplot立即评估data=...参数,并将数据集存储为绘图定义的一部分(在gtable中)。因此,为每个绘图创建不同的数据框(上面称为gg)将起作用。

最后,看起来你正在尝试创建一对图(每列与每一列,或多或少)。除非这是一项家庭作业,否则有更简单的方法可以做到这一点。你可以在ggpairs(...)包中使用GGally(使用网格图形),或者你可以使用带有facet的基本ggplot这样做:

# make up some data
set.seed(1)    # for reproducible example
df <- data.frame(matrix(rnorm(700),nc=7))
df[4] <- 1+2*df[3] + rnorm(100)
df[5] <- 3*df[3] - 2*df[4] + rnorm(100)
df[6] <- -10*df[5] + rnorm(100)

# you start here...
gg.pairs <- function(data) { # scatterplot matrix using ggplot facets
  require(ggplot2)
  require(data.table)
  require(reshape2)    # for melt(...)

  DT <- data.table(melt(cbind(id=1:nrow(data),data),id="id"),key="id")
  gg <- DT[DT,allow.cartesian=T]
  setnames(gg,c("id","H","x","V","y"))
  ggplot(gg[as.integer(gg$H)<as.integer(gg$V),], aes(x,y)) + 
    geom_point(shape=1) + 
    facet_grid(V~H, scales="free")
}
gg.pairs(df[3:7])

答案 1 :(得分:2)

我认为您的问题在于R懒惰评估。事实上,当您分配plot1plot2时,但是当您调用它时,不会创建xVaryVar,此时{{1}}只有一个副本(最后一个) {{1}}和情节是相同的

答案 2 :(得分:1)

好吧,我无法解释发生了什么,但解决方法是使用列名而不是aes_string列。以下为我在multiplot中创建了两个独特的图,这个更改可以很容易地合并到您的绘图循环中。

dat = data.frame(x = rnorm(10), y1 = rnorm(10), y2 = rpois(10, 5))

xVar = names(dat)[1]
yVar = names(dat)[2]
plot1 = ggplot(data = dat, aes_string(xVar, yVar)) + geom_point(shape=1)

yVar = names(dat)[3]
plot2 = ggplot(data = dat, aes_string(xVar, yVar)) + geom_point(shape=1)

multiplot(plot1, plot2, cols=2)