ggplot2 中的背景条使用 geom_rect

Background bars in ggplot2 using geom_rect

我在名为“dat1_na”的数据集中有每日流量数据。

它跨越 ~1940 和 ~2020,所以这个数据集中有 18,780 行。

str(dat1_na) 是:

'data.frame':   18780 obs. of  9 variables:
 ...
 $ MLd    : num  96 34 34 20 34 34 52 34 34 26 ...
 $ Date   : Date, format: "1943-09-19" "1943-09-07" "1943-09-08" "1943-09-11" ...
 ...
 $ Climate: chr  "Dry" "Dry" "Dry" "Dry" ...

所以这是一个简单的线图(流量曲线图),显示 MLd(日流量)与时间的关系,这没问题。 但是,我正在尝试根据数据集的 'Climate' 部分使用 geom_rect 对背景进行着色,该部分只有 2 个可能的值:“干”和“湿”。问题是我无法让背景正常显示。我知道数据正在被正确读取,因为如果我稍微调整一下我的代码,我可以看到它们应该在的干旱年份和潮湿年份:

ggplot(dat1_na, aes(x=Date, y=MLd, xmin=Date, xmax=Date, ymin=0, ymax=6000)) + 
  geom_line(colour = "#231EDC") + 
  geom_rect(aes(colour=Climate), alpha=0.2) +
  theme_minimal() 

graph using aes(colour=Climate)

我真正想要的是它是透明的并且位于折线图的后面。我似乎无法让它工作。我已经尝试了几个版本的代码,包括 ggplot() 语句或 aes() 语句中的内容,但没有任何效果。我有我认为应该有效的代码,但是 geom_rect 中没有任何内容出现(除了看起来正确的图例)。

ggplot(dat1_na, aes(x=Date, y=MLd, xmin=Date, xmax=Date, ymin=0, ymax=6000)) + 
  geom_line(colour = "#231EDC") + 
  geom_rect(aes(fill=Climate), linetype=0, alpha=0.2) +
  theme_minimal() 

graph using aes(fill=Climate)

我想知道它是否与我的数据中的行数 (~18,000) 有关,导致 geom_rect 太小并且只有轮廓大到足以显示。问题是我无法让轮廓透明。我假设代码为每一行绘制一个矩形,根据 dat1_na$Climate.

的值,粉色或绿色

有人有什么建议吗?

干杯

如果没有可重现的示例很难进行演示,所以让我们创建一个与您自己的数据具有相同列名和类型的示例:

set.seed(8)

dat1_na <- data.frame(MLd = 40 + cumsum(sample(seq(-5, 5), 100, TRUE)),
                      Date = sort(as.Date(sample(seq(-9601, 9601), 100, TRUE),
                                          origin = '1970-01-01')),
                      Climate = c('Dry', 'Wet')[round(1.5 + 
                                  cumsum(runif(100, -0.01, 0.01)))])
dat1_na

这里的关键是根据 Climate

中变化的开始和结束日期,为矩形创建一个小数据框
library(tidyverse)

rect_frame <- dat1_na %>%
  arrange(Date) %>%
  mutate(change = lag(Climate) != Climate, 
         change = c(TRUE, change[-c(1, nrow(.))], TRUE)) %>%
  filter(change) %>%
  mutate(End_Date = lead(Date))

现在,当我们绘图时,确保我们首先绘制 rect 图层。它应该由 fill 美学而不是 color 美学填充,并且该层需要作为其 data 参数传递 rect_frame

ggplot(dat1_na, aes(x = Date, y = MLd)) + 
  geom_rect(data = rect_frame, 
            aes(fill = Climate, xmin = Date, xmax = End_Date, 
                ymin = -Inf, ymax = Inf), alpha = 0.2) +
  geom_line(colour = "#231EDC") + 
  theme_minimal()