我想使用ggplot2生成一个像下面这样的图,其中线和参考值之间的区域是阴影的,而阴影的颜色取决于y是大于还是小于参考值。

下面是一个使用LakeHuron数据集的reprex,将579设置为引用值,并使用geom_ribbon()进行阴影处理。这一点很接近,但我只想填充这条线和参考线之间的区域。
huron <- data.frame(year = 1875:1972, level = as.vector(LakeHuron))
ggplot(data = huron, aes(x = year)) +
geom_ribbon(aes(ymin = 579, ymax = level, fill = level > 579)) +
geom_line(aes(y = level)) +
geom_hline(yintercept = 579)

有人有什么想法吗?提前谢谢。
发布于 2022-07-13 20:49:04
如果你想要两种不同的填充,你需要两条丝带:
ggplot(data = huron, aes(x = year)) +
geom_ribbon(aes(ymin = 579, ymax = ifelse(level > 579, level, 579),
fill = "Above average")) +
geom_ribbon(aes(ymax = 579, ymin = ifelse(level > 579, 579, level),
fill = "Below average")) +
geom_line(aes(y = level)) +
geom_hline(yintercept = 579) +
scale_fill_manual(values = c("#86b2d8", "#bf311a"), name = NULL) +
theme_classic(base_size = 16)

发布于 2022-07-13 21:07:45
第二个选择是使用ggh4x::stat_difference,IMHO是ggh4x包的隐藏宝石之一:
huron <- data.frame(year = 1875:1972, level = as.vector(LakeHuron))
library(ggplot2)
library(ggh4x)
ggplot(huron, aes(x = year)) +
ggh4x::stat_difference(aes(ymin = 579, ymax = level), levels = c("Above average", "Below Average")) +
geom_line(aes(y = level)) +
geom_hline(yintercept = 579) +
scale_fill_manual(limits = c("Above average", "Below Average"), values = rev(scales::hue_pal()(2))) +
labs(fill = NULL)

https://stackoverflow.com/questions/72972363
复制相似问题