我正在尝试使用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)
答案 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
中名为yVar
和aes(...)
的变量。因此,当渲染这些图时,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懒惰评估。事实上,当您分配plot1
和plot2
时,但是当您调用它时,不会创建xVar
和yVar
,此时{{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)