Градиентное заполнение аннотации на диаграмме временных рядов в ggplot2 - PullRequest
0 голосов
/ 14 июля 2020

Используя ggplot2, я хотел бы добавить фигуру annotate() к графику временного ряда на основе спецификаций даты, а затем плавно заполнить фигуру слева направо от "gray90" до "gray50". Ниже приведен минимально рабочий пример:

library(ggplot2)

set.seed(813)
min_date = as.Date("2020-05-01")
max_date = as.Date("2020-07-14")
dates = seq(min_date, max_date, by = "day")
shaded_start = max_date - 21

df <- data.frame(dates = dates,
                 volumes = runif(length(dates)))

chart <- ggplot(df, aes(x = dates, y = volumes)) +
    geom_line() +
    annotate("rect", xmin = shaded_start, xmax = max_date + 2,
       ymin = 0, ymax = Inf, alpha = .4) +
    scale_fill_gradient(low = "gray90", high = "gray55")

chart

введите описание изображения здесь

Как видите, серая заштрихованная область имеет один цвет вместо серого, а не заполнена градиентом. Я открыт для использования чего-то другого, кроме annotate(), например geom_rect() или geom_raster(), но я еще не смог понять это ни с одним из этих вариантов.

Ответы [ 2 ]

2 голосов
/ 15 июля 2020

К сожалению, нет собственного способа сделать градиентную заливку в ggplot. Каждый элемент может иметь только однородную заливку. Однако вполне возможно сделать так, будто у вас есть градиентная заливка, создав кучу постепенно меняющихся полос:

library(ggplot2)

set.seed(813)
min_date = as.Date("2020-05-01")
max_date = as.Date("2020-07-14")
dates = seq(min_date, max_date, by = "day")
shaded_start = max_date - 21

lefts <- seq(shaded_start, max_date, 0.5)
rights <- c(lefts[-1], max_date + 0.5)
maxs <- rep(Inf, length(lefts))
mins <- rep(-Inf, length(lefts))
fill <- seq(0, 1, length.out = length(lefts))
shade_df <- data.frame(lefts, rights, maxs, mins, fill)

df <- data.frame(dates = dates,
                 volumes = runif(length(dates)))

chart <- ggplot(df, aes(x = dates, y = volumes)) +
  geom_rect(data = shade_df, inherit.aes = FALSE,
            aes(xmin = lefts, xmax = rights, ymin = mins, ymax = maxs, fill = fill),
            colour = NA, size = 0) +
  geom_line() +
  scale_fill_gradient(low = "gray90", high = "gray55") +
  theme(legend.position = "none")

chart

введите описание изображения здесь

1 голос
/ 15 июля 2020

Вот подход с geom_tile и подмножеством исходных данных:

ggplot(df, aes(x = dates, y = volumes)) +
  geom_line() +
  geom_tile(data = subset(df, df$dates >= shaded_start),
            aes(x = dates, y = 0.5, fill = as.numeric(dates)),
            alpha = 0.6, height = 1.2, show.legend = FALSE) +
  scale_fill_gradient(low = "gray90", high = "gray55")

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...