我有以下简单的线图,其中的丝带表示沿 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)
我做了很多尝试来设置 的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方法实现类似视觉结果的有效方法。
我会这样做:
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)