【问题标题】:Enriching a ggplot2 plot with multiple geom_segment in a loop?在循环中使用多个 geom_segment 丰富 ggplot2 图?
【发布时间】:2017-04-06 08:31:33
【问题描述】:

我使用以下方法成功创建了一个情节:

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

它不起作用,只创建最后一个段。任何人都可以建议这里有什么问题吗?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    这与 aes() 值的惰性求值有关。您正在绑定到变量i,但实际上并没有在循环中对其进行任何操作。直到您真正 print(p) 才解决映射。从本质上讲,这意味着它们都被绑定到i,并且在循环退出后,i 将具有它在最终循环中的值。

    所以问题真的是你不应该在这里使用aes(),因为你真的不想要主动绑定。只需在aes() 之外设置xxend 值。 (并且由于y 是恒定的,它们也应该在aes() 之外)。

    values <- c(1, 5)
    for (i in values) {
       p <- p + geom_segment(x=i, y=103, xend=i, yend=107)
    }
    

    【讨论】:

    • 我发布的内容将解决它。不要在循环中的geom_segment() 中使用aes()
    • 我就是这么想的。你知道为什么在 for 循环中添加 print 语句或使用 force 不能修复问题吗?
    • @csgillespie 因为在这种情况下,您仍然绑定到 变量 i,而不是值。在实际绘制情节之前,您不能强制 aes 解析名称。 force 有时在这种情况下很有用,但对于 aes 的非标准评估,它在这种情况下无济于事。
    【解决方案2】:

    另一种方法是完全避免使用循环。您可以将分段数据与主要数据打包在单独的 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))
    

    【讨论】:

    • 这似乎更好。我什至无法得到其他答案!
    • @SkyWalker 你能把这个作为答案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多