在循环中用多个geom_segment丰富ggplot2图?

时间:2014-07-07 18:34:21

标签: r ggplot2

我使用以下内容成功创建了一个情节:

# 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))
}

它不起作用,只创建了最后一个段。任何人都可以在这里提出建议吗?

2 个答案:

答案 0 :(得分:12)

它与aes()值的惰性评估有关。您绑定到变量i但实际上没有在循环中对其执行任何操作。在实际print(p)之前,映射尚未得到解决。从本质上讲,这意味着它们都被绑定到i,并且在循环退出后,i将具有它在最终循环期间具有的值。

所以问题实际上是你在这里不能使用aes(),因为你并不真正想要主动绑定。只需将xxend值设置在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))