Estoy tratando de crear una gráfica de series de tiempo de datos históricos que muestre datos de un solo año rodeados de sombreados que representan la variabilidad (hasta 2 desviaciones estándar) presente en los datos durante varios años. Realmente me gustaría que este sombreado fuera un degradado de color, algo así como colores más oscuros más cercanos a la media cada vez más clara.

Hasta ahora he logrado crear un gráfico de series de tiempo con intervalos de confianza usando el siguiente código

> library(ggplot2)

## Here is the what the data looks like. Not lower_ci and upper_ci are just
## Mean_sales - (2 * Std_dev_sales) and Mean_sales + (2 * Std_dev_sales) respectively. 
## upper_dif and lower_dif is simply the difference between the mean and
## the confidence intervals

> head(sales_summary, 3)
# A tibble: 3 x 7
  Date  Mean_sales Std_dev_sales lower_ci upper_ci lower_dif upper_dif
  <chr>      <dbl>         <dbl>    <dbl>    <dbl>     <dbl>     <dbl>
1 06-26   4761794.       970015. 2821763. 6701824. -1940030.  1940030.
2 06-27   4528859.       327306. 3874247. 5183471.  -654612.   654612.
3 06-28   5139476.      1105831. 2927814. 7351138. -2211662.  2211662.  

> theme_set(theme_classic())
> ggplot(data = sales_summary, 
>       aes(x = as.Date(Date, format = "%m-%d"), y = Mean_sales)) +
>  geom_ribbon(aes(ymin=lower_ci, 
>                  ymax=upper_ci), 
>              linetype=0, alpha=0.2,
>              fill = "blue")

Dándome esta trama básica

Mi solución actual para crear un gradiente es simplemente crear una gran cantidad de geom_ribbons que representen proporciones de la varianza, usando el siguiente código.

ggplot(data = sales_summary, 
       aes(x = as.Date(Date, format = "%m-%d"), y = Mean_sales)) +
  #geom_line(color = "black", size = 1) +
  geom_ribbon(aes(ymin=lower_ci, 
                  ymax=upper_ci), 
              linetype=0, alpha=0.1,
              fill = "steelblue") +

  geom_ribbon(aes(ymin=lower_ci - (0.1 * lower_dif), 
                  ymax=upper_ci - (0.1 * upper_dif)), 
              linetype=0, alpha=0.1,
              fill = "steelblue") +

  geom_ribbon(aes(ymin=lower_ci - (0.2 * lower_dif), 
                  ymax=upper_ci - (0.2 * upper_dif)), 
              linetype=0, alpha=0.1,
              fill = "steelblue") +

  geom_ribbon(aes(ymin=lower_ci - (0.3 * lower_dif), 
                  ymax=upper_ci - (0.3 * upper_dif)), 
              linetype=0, alpha=0.1,
              fill = "steelblue") +

  geom_ribbon(aes(ymin=lower_ci - (0.4 * lower_dif), 
                  ymax=upper_ci - (0.4 * upper_dif)), 
              linetype=0, alpha=0.1,
              fill = "steelblue") +

  geom_ribbon(aes(ymin=lower_ci - (0.5 * lower_dif), 
                  ymax=upper_ci - (0.5 * upper_dif)), 
              linetype=0, alpha=0.1,
              fill = "steelblue") +

  geom_ribbon(aes(ymin=lower_ci - (0.6 * lower_dif), 
                  ymax=upper_ci - (0.6 * upper_dif)), 
              linetype=0, alpha=0.1,

              fill = "steelblue") +
  geom_ribbon(aes(ymin=lower_ci - (0.7 * lower_dif), 
                  ymax=upper_ci - (0.7 * upper_dif)), 
              linetype=0, alpha=0.1,
              fill = "steelblue") +

  geom_ribbon(aes(ymin=lower_ci - (0.8 * lower_dif), 
                  ymax=upper_ci - (0.8 * upper_dif)), 
              linetype=0, alpha=0.1,
              fill = "steelblue") +

  geom_ribbon(aes(ymin=lower_ci - (0.9 * lower_dif), 
                  ymax=upper_ci - (0.9 * upper_dif)), 
              linetype=0, alpha=0.1,
              fill = "steelblue")

Esto funciona para darme el efecto deseado como se puede ver en este gráfico pero es muy copiar y pegar mucho, especialmente porque no he podido hacer que ningún bucle funcione con ggplot (solo se devuelve el último gráfico de iteración).

Gracias de antemano.

2
AcceptableCarrot 26 sep. 2019 a las 03:07

1 respuesta

La mejor respuesta

Puede agregar un list de geoms a una parcela para agregar múltiples geoms a la vez. Eso significa que puede usar purrr::map para crear las geoms con diferentes proporciones:

library(purrr)

ggplot(data = sales_summary, 
       aes(x = as.Date(Date, format = "%m-%d"), y = Mean_sales)) +
    map(seq(0.1, 1, by = 0.1), function(prop) {
        geom_ribbon(aes(ymin=lower_ci - (prop * lower_dif), 
                        ymax=upper_ci - (prop * upper_dif)), 
                    linetype=0, alpha=0.1,
                    fill = "steelblue")
    })
0
Marius 26 sep. 2019 a las 00:16