我在更新ggplot对象时遇到了一些问题。我想要做的是在每个循环中更改一个特定位置的垂直线,因此:多行将显示在不同的位置。但是,当我使用for循环时,它只显示它创建的最后一行,但是当我手动执行它时,它可以正常工作。我创建了一个可以重现的例子,你们可以查看:
library(ggplot2)
x <- ggplot(mapping = aes(x = 1:100, y = 1:100)) +
geom_line()
for(i in 1:6){
x <- x + geom_vline(aes(xintercept = i*5))
}
y <- ggplot(mapping = aes(x = 1:100, y = 1:100)) +
geom_line()
y <- y + geom_vline(aes(xintercept = 5))
y <- y + geom_vline(aes(xintercept = 10))
y <- y + geom_vline(aes(xintercept = 15))
y <- y + geom_vline(aes(xintercept = 20))
y <- y + geom_vline(aes(xintercept = 25))
y <- y + geom_vline(aes(xintercept = 30))
检查两个图。为什么第一个情节与第二个情节看起来不一样,尽管对我来说两个进程都是&#34;相同&#34;事?
答案 0 :(得分:4)
我正在寻找一些人离开我的一些贡献,并且有一个人非常有效地解决它,它是使用aes_()而不是aes()。区别在于aes_()强制评估和更新绘图,而aes()仅在绘制绘图时评估索引。因此:它在for循环中永远不会更新。
library(ggplot2)
x <- ggplot(mapping = aes(x = 1:100, y = 1:100)) +
geom_line()
for(i in 1:6){
x <- x + geom_vline(aes_(xintercept = i*5))
}
答案 1 :(得分:1)
这与ggplot如何进行延迟评估有关 - 请参阅here。
由于geom_vline
已向量化,因此可以:
library(ggplot2)
x <- ggplot() +
geom_line(mapping = aes(x = 1:100, y = 1:100))
x + geom_vline(aes(xintercept = seq(5,30,5)))