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()
我在名为“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()