首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GGally putPlot在循环中不工作。

GGally putPlot在循环中不工作。
EN

Stack Overflow用户
提问于 2014-03-07 09:14:04
回答 1查看 611关注 0票数 5

我正在尝试使用putplot来改变ggpairs图的对角线上的图。我可以一个一个地做这个,但是当我使用一个循环时,对角线元素是相同的!

代码语言:javascript
复制
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)

解开回路起作用..。为什么.?

代码语言:javascript
复制
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)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-08 07:43:24

这是ggplot中所谓的懒惰评估的结果。对各种ggplot函数的调用实际上并不会创建一个图,而是定义如何呈现这个图。该情节仅用print(p)创建。

问题是,aes(...)的参数作为表达式存储在绘图定义中,并且只有在呈现绘图时才计算这些表达式。因此,在您的示例中,对ggplot的四个调用都是以相同的方式存储的,使用x=iris[,i]。在呈现绘图时,i=4和所有四个对角线槽都是用x=iris[,4]呈现的。

那该怎么处理呢?我们必须将x的定义放在对aes(...)的调用之外。这一守则的目的是:

代码语言:javascript
复制
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,并提供几乎相同的解决方案。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22245893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档