具有常量“ymin”和“ymax”的 ggplot 功能区

vpi*_*pkt 1 r ggplot2

我有以下简单的线图,其中的丝带表示沿 y 轴的感兴趣阈值。

library(ggplot2)
main.df <- data.frame(time = c(1:20, 1:20), 
                level = runif(40), 
                type = c(rep('A', 20), rep('B', 20)))

gg <- ggplot(main.df, aes(x = time, y = level, colour = type)) 
gg + geom_ribbon(ymin = 0.1, ymax = 0.25, fill = 'green') + 
    geom_ribbon(ymin = 0.25, ymax = 0.5, fill = 'yellow') + 
    geom_ribbon(ymin = 0.5, ymax = 0.95, fill = 'red') + 
    geom_line()
Run Code Online (Sandbox Code Playgroud)

所需的 ggplot 但不是所需的方法

我做了很多尝试来设置 的data属性,geom_ribbon以给我更大的灵活性并清理我的代码。这是一个这样的例子。

rib.df <- data.frame(low = c(0.1, 0.25, 0.5), high = c(0.25, 0.50, 0.95), 
                     lab = c('green', 'yellow', 'red'))

gg + geom_ribbon(data = rib.df,   
      aes(ymin = low, ymax = high, fill = lab), 
      inherit.aes=FALSE) + geom_line()
Run Code Online (Sandbox Code Playgroud)

这个特定的错误在于缺少审美x。有趣的是,这在前面的示例中不是问题。我尝试过设置 x 和 y ,似乎里面aes和不是里面的每一个组合。我也不清楚为什么有时geom_ribbon需要一个,y而这不是必需的审美。

我的问题总结:如何调用geom_ribbon设置data参数来实现与上述手动调用类似的结果?

我也很高兴了解使用其他geom方法实现类似视觉结果的有效方法。

Gre*_*gor 5

我会这样做:

rib2 = rbind(rib.df, rib.df)
rib2$x = rep(c(-Inf, Inf), each = nrow(rib.df))

gg + geom_ribbon(data = rib2,   
      aes(x = x, ymin = low, ymax = high, fill = lab),
      inherit.aes=FALSE) + 
   geom_line()
Run Code Online (Sandbox Code Playgroud)

色带的 ymin 和 ymax 值会根据不同的 x 值而变化。在这种情况下,您只是绘制矩形,您可以通过使用 来简化geom_rect,在这种情况下,您可以在问题xmin = -Inf, xmax = Inf之外设置aes()并使用rib.df问题中的 。这样,您不必将数据加倍即可显示 ymin 和 ymax 在最小和最大 x 值处相同。

gg + geom_rect(data = rib.df,   
          aes(ymin = low, ymax = high, fill = lab),
          xmin = -Inf, xmax = Inf,
          inherit.aes=FALSE) +
    geom_line()
Run Code Online (Sandbox Code Playgroud)