我使用以下内容成功创建了一个情节:
# suppose I have a p <- ggplot(data=df, ...) then the following works
# I get those two segments plotted correctly
p <- p + geom_segment(aes(x=1,y=103,xend=1,yend=107))
p <- p + geom_segment(aes(x=5,y=103,xend=5,yend=107))
但是,如果我这样做:
values <- c(1, 5)
for (i in values) {
p <- p + geom_segment(aes(x=i,y=103,xend=i,yend=107))
}
它不起作用,只创建了最后一个段。任何人都可以在这里提出建议吗?
答案 0 :(得分:12)
它与aes()
值的惰性评估有关。您绑定到变量i
但实际上没有在循环中对其执行任何操作。在实际print(p)
之前,映射尚未得到解决。从本质上讲,这意味着它们都被绑定到i
,并且在循环退出后,i
将具有它在最终循环期间具有的值。
所以问题实际上是你在这里不能使用aes()
,因为你并不真正想要主动绑定。只需将x
和xend
值设置在aes()
之外即可。 (由于y
是常数,因此它们也应该在aes()
之外。
values <- c(1, 5)
for (i in values) {
p <- p + geom_segment(x=i, y=103, xend=i, yend=107)
}
答案 1 :(得分:11)
另一种方法是避免使用循环。您可以将段数据打包到主数据的单独data.frame中,并使用aes()一次性绘制所有内容:
segment_data = data.frame(
x = c(1, 5),
xend = c(1, 5),
y = c(103, 103),
yend = c(107, 107)
)
p = ggplot(df, ...) +
geom_segment(data = segment_data, aes(x = x, y = y, xend = xend, yend = yend))