gpt4 book ai didi

r - GGally putPlot 无法在循环中工作

转载 作者:行者123 更新时间:2023-12-02 20:20:27 26 4
gpt4 key购买 nike

我正在尝试使用 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)

Non working example

解除循环有效...为什么...?

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)

Working example

最佳答案

这是 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)

在这里,我们使用 x 的相应 iris 列将 ggplot 的默认数据集设置为每个图中的不同数据框。其起作用的原因是对 x=iris[,i] 的引用在对 aes(...) 的调用中不是

参见this link对于密切相关的问题,具有几乎相同的解决方案。

关于r - GGally putPlot 无法在循环中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22245893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com