作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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)
最佳答案
这是 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/
我正在尝试使用 putplot 更改 ggpairs 图对角线上的图。我可以一项一项地执行此操作,但是当我使用循环时,对角线元素是相同的! library(ggplot2) library(GGall
我是一名优秀的程序员,十分优秀!