我正在尝试使用putplot来改变ggpairs图的对角线上的图。我可以一个一个地做这个,但是当我使用一个循环时,对角线元素是相同的!
library(ggplot2)
library(GGally)
p=ggpairs(iris,
columns=, c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width"),
colour='Species',
lower=list(continuous='points'),
axisLabels='none',
upper=list(continuous='blank')
)
for (i in 1:4) {
p <- putPlot(p, ggplot(iris, aes(x=iris[,i], colour=Species)) + stat_ecdf(), i,i)
}
print(p)

解开回路起作用..。为什么.?
p <- putPlot(p, ggplot(iris, aes(x=iris[,1], colour=Species)) + stat_ecdf(), 1,1)
p <- putPlot(p, ggplot(iris, aes(x=iris[,2], colour=Species)) + stat_ecdf(), 2,2)
p <- putPlot(p, ggplot(iris, aes(x=iris[,3], colour=Species)) + stat_ecdf(), 3,3)
p <- putPlot(p, ggplot(iris, aes(x=iris[,4], colour=Species)) + stat_ecdf(), 4,4)

发布于 2014-03-08 07:43:24
这是ggplot中所谓的懒惰评估的结果。对各种ggplot函数的调用实际上并不会创建一个图,而是定义如何呈现这个图。该情节仅用print(p)创建。
问题是,aes(...)的参数作为表达式存储在绘图定义中,并且只有在呈现绘图时才计算这些表达式。因此,在您的示例中,对ggplot的四个调用都是以相同的方式存储的,使用x=iris[,i]。在呈现绘图时,i=4和所有四个对角线槽都是用x=iris[,4]呈现的。
那该怎么处理呢?我们必须将x的定义放在对aes(...)的调用之外。这一守则的目的是:
for (i in 1:4) {
p <- putPlot(p,ggplot(data=data.frame(x=iris[,i],Species=iris$Species),
aes(x=x,colour=Species)) + stat_ecdf(), i,i)
}
print(p)在这里,我们将ggplot的默认数据集设置为每个地块中的不同数据帧,使用相应的iris列表示x,原因是对x=iris[,i]的重新映射不是在调用aes(...)。
有关一个密切相关的问题,请参阅this link,并提供几乎相同的解决方案。
https://stackoverflow.com/questions/22245893
复制相似问题