使用for循环(R)更新ggplot

时间:2017-06-01 21:41:05

标签: r for-loop ggplot2

我在更新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;事?

2 个答案:

答案 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)))