要在时间序列图中标记几个周期,我使用geom_rect
ggplot (peakflow, aes (x = Datum, y = l_min)) +
geom_rect (xmin = as.Date ("2018-08-03"),
xmax = as.Date ("2018-09-04"),
fill = "palegreen",
ymin = -Inf, ymax = Inf, alpha = 0.01) +
geom_rect (xmin = as.Date ("2018-09-20"),
xmax = as.Date ("2018-09-22"),
fill = "palegreen",
ymin = -Inf, ymax = Inf, alpha = 0.01) +
geom_line (colour = "blue")
现在我有几个数据框,应该用相同的时间段标记,但是我不想在每个图上都添加geom_rect
(因为不时添加了一个rect);这容易出错,而且不太舒服。
是否可以存储rect并在以后像使用它们
rects <- geom_rect (...) +
geom_rect (...)
ggplot (peakflow, aes (x = Datum, y = l_min)) +
rects + geom_line ()
ggplot (other_df, ...) +
rects + geom_line ()
我知道:以上方法无效;还有另一种方法吗?
答案 0 :(得分:0)
一种选择是如下使用lapply
。
# generate sample data
dat1 <- head(iris, 20)
dat2 <- tail(iris, 20)
plots <- lapply(list(dat1, dat2), function(x) {
# replace this good with your function
ggplot(data = x, mapping = aes(Sepal.Width, Sepal.Length)) +
geom_point() +
geom_smooth()
})
结果
plots[[1]]
plots[[2]]
如果您要存储geom
,则可以
my_geoms <- function() {
list(geom_point(),
geom_smooth())
}
ggplot(dat1, mapping = aes(Sepal.Width, Sepal.Length)) +
my_geoms()
答案 1 :(得分:0)
如果要在一个对象中定义多个geom图层,请将其以a + b + ...
而不是annotate()
的形式放在列表中。
此外,从您的描述来看,geom_rect()
比rects <- list(annotate(geom = "rect",
xmin = as.Date("2018-08-03"),
xmax = as.Date("2018-09-04"),
ymin = -Inf, ymax = Inf,
fill = "palegreen", alpha = 0.5),
annotate(geom = "rect",
xmin = as.Date("2018-09-20"),
xmax = as.Date("2018-09-22"),
ymin = -Inf, ymax = Inf,
fill = "palegreen", alpha = 0.5))
ggplot(df, aes(x = x, y = y)) +
rects +
geom_point()
更好地为您服务,因为set.seed(123)
df <- data.frame(
x = seq(as.Date("2018-07-01"), as.Date("2018-12-31"), 1),
y = rnorm(184)
)
可以在您提供数据时使用数据框明确显示所有尺寸。
两个geom图层列表的插图(尽管在这种情况下,两个矩形实际上可以在同一图层中定义...):
{{1}}
样本数据:
{{1}}