【问题标题】:Update a ggplot using a for loop (R) [duplicate]使用 for 循环(R)更新 ggplot [重复]
【发布时间】:2017-11-03 04:34:28
【问题描述】:

我在更新 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))

检查两个图。为什么第一个情节看起来与第二个情节不一样,尽管对我来说两个过程都做“相同”的事情?

【问题讨论】:

  • 查看this answer 了解正在发生的事情。
  • geom_vline for 循环中使用 aes_ 而不是 aes 将得到与 y 相同的情节。

标签: r for-loop ggplot2


【解决方案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)))

【讨论】:

  • 感谢您的帮助,亚历克斯。实际上,您的示例在这个可复制的示例中有效,但在其他应用程序中非常有限。我只是在阅读人们让我阅读的其他一些 cmets,最好的解决方案是使用 aes_() 而不是 aes()。
【解决方案2】:

我正在查看一些人留下的一些贡献,并且有一个非常有效地解决了它,它是使用 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))
}

【讨论】:

  • 这是一个非常简单的解决循环中惰性求值问题的方法。
猜你喜欢
  • 2020-06-09
  • 2021-05-08
  • 2021-06-13
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多