我正在使用ggplot()
和geom_line()
为随时间推移而变化的值走廊创建线图。
有时可能会发生上限低于下限的情况(我称之为"反转"),我希望在图中突出显示发生这种情况的区域,比如使用不同的背景颜色。
搜索谷歌和StackOverflow都没有让我找到任何地方。
下面是一个人为的例子:
library(tidyverse)
library(RcppRoll)
set.seed(42)
N <- 100
l <- 5
a <- rgamma(n = N, shape = 2)
d <- tibble(x = 1:N, upper = roll_maxr(a, n = l), lower = roll_minr(a + lag(a), n = l)) %>% mutate(inversion = upper < lower)
dl <- pivot_longer(d, cols = c("upper", "lower"), names_to = "Bounds", values_to = "bound_vals")
ggplot(dl, mapping = aes(x = x, y = bound_vals, color = Bounds)) + geom_line(linewidth = 1) + theme_light()
这将生成以下图:
正如你所看到的,反转发生在一些地方,例如在x = 50
附近。我希望图有一个较暗的背景(比如灰色),基于inversion
列已经在tibble中。我该怎么做?
非常感谢您的帮助!
2条答案
按热度按时间dced5bon1#
一个实现你想要的结果的方法是使用
ggh4x::stat_difference
,注意,为此我们必须使用宽数据集,并相应地通过两个geom_line
添加行。EDIT当然也可以为相交区域绘制背景矩形。但是我不知道有任何现成的选项,也就是说,棘手的部分是计算线相交处的x值,这需要一些努力和近似。这里有一种方法,但可能不是最有效的。
fbcarpbf2#
回答我自己,下面的方法最后对我起作用了(也使用了实际数据和用
facet_wrap()
分组的图); h/t到@stefan,其对geom_rect()
I的方法被回收:这给出了
这正是我想要的。