如果我将一个值传递给ggplot,它将作为引用存储,因此如果它被修改,plot也会被更改。然而,只有当它被赋予aes函数,而不是我的示例中的geom_hline时,才会发生这种情况。
library(ggplot2)
# The line is at 10
value <- 10
pl <- ggplot() + geom_hline(yintercept=value)
value <- 0
pl
# The line is at 0
value <- 10
pl <- ggplot() + geom_hline(aes(yintercept=value))
value <- 0
pl
我相信这个问题与这个问题有关,但我不明白我能做些什么来避免这种行为。我可以强制ggplot复制数据吗?
关于用例,假设我有一个循环来绘制许多单独的图形,并且在循环的每次迭代中value
都会发生变化。
plot_list <- NULL
for (value in 1:10) {
# The title goes from 1 to 10 but all the lines are on 10.
plot_list[[value]] <- ggplot() + geom_hline(aes(yintercept=value)) + labs(title=value)
}
plot_list
我认为这是因为您的绘图列表并不是真正保存绘图的对象,而是保存绘图的代码。我不知道如何改变这种行为,但使用map函数可以很容易地实现您想要的行为。
首先,制作绘图功能,以值作为输入:
plotter <- function(value) {
new_plot <-
ggplot() +
geom_hline(aes(yintercept = value))
return(new_plot)
}
将函数映射到您的值列表上,1:10:
my_plots <- map(.x = 1:10, .f = plotter)
现在,您可以看到保存列表中的ggplot对象得到了适当的更新:
my_plots[[1]]
my_plots[[5]]
我发现在大多数情况下,映射函数比循环更有用、更直观,所以我希望这能有所帮助!