Заполните область под временным рядом на основе значения фактора

Я пытаюсь заполнить область под линией временного ряда на основе значения коэффициента 0 и 1. Область должна быть заполнена только в том случае, если значение равно 1.

Мне удалось раскрасить линию временного ряда на основе значения фактора с помощью следующего кода:

install.packages("scales")
library("scales")
library("ggplot2")
ggplot(plot.timeseries) +
  geom_line(aes(x = Date, y = Price, color = Index, group = 1)) +
  scale_x_date(labels = date_format("%Y"), breaks = date_breaks("years")) + 
  scale_colour_manual(values = c("red3", "green3")) 

Это дает следующий график:

plot1

Я тоже пробовал это:

ggplot(plot.timeseries, aes(x=Date, y = Price, fill=Index)) +
  geom_area(alpha=0.6) +
  theme_classic() +
  scale_fill_manual(values=c("#999999", "#32CD32"))

что выходит как полный беспорядок:

plot2

В идеале конечный результат должен выглядеть как plot1, где участки линии, выделенные зеленым цветом, закрашены.

Доступ к данным временных рядов можно получить здесь:

https://drive.google.com/file/d/1qWsuJk41_fJZktLCAZSgfGvoDLqTt-jk/view?usp=sharing

Любая помощь будет принята с благодарностью!


person Ittai Barkai    schedule 01.08.2019    source источник
comment
Посмотрите последний пример в это руководство, в котором используется оператор ifelse() в geom_area() для достижения заливки под кривой.   -  person kstew    schedule 02.08.2019
comment
Спасибо за совет, обязательно попробую. Если мне удастся это выяснить, я опубликую здесь результат.   -  person Ittai Barkai    schedule 02.08.2019
comment
К сожалению, похоже, что это не работает, или, по крайней мере, я не мог понять, как его применить, не получая ошибок. Я даже попытался преобразовать даты в числовые значения, а затем применить оператор ifelse.   -  person Ittai Barkai    schedule 02.08.2019


Ответы (2)


Хорошо, вот что я сделал, чтобы получить график, показанный ниже, если вы этого хотите.

# -------------------------------------------------------------------------

# load required packages # 

library(scales)
library("ggplot2")
library(dplyr)

# -------------------------------------------------------------------------
# load the data to a df #
plot.timeseries <- get(load("TimeSeries_Data.RData"))

# -------------------------------------------------------------------------

# transform the data (my_fill_color will have green and NA values)
my_object <- plot.timeseries %>%
  select(Price, Index, Date) %>%
  mutate(Index_ord_factor = factor(Index, levels = unique(Index), ordered=TRUE),
         my_fill_color = case_when(
           Index_ord_factor > 0   ~ "green" # ordered factor enables the '>' operation
         ))

# -------------------------------------------------------------------------

# Plot your graph using the transformed data

ggplot(my_object, mapping = aes(x=Date, y=Price)) +
  geom_line(aes(color = Index, group = 1))+
  geom_col(fill =my_object$my_fill_color, width = 1)

# -------------------------------------------------------------------------


Дайте мне знать, если вам нужна доработка, чтобы понять сценарий. Прилагаю вывод в моем конце. Заполнить область временного ряда на основе значения коэффициента

person deepseefan    schedule 02.08.2019
comment
Большое спасибо! Если я чего-то не понимаю, обязательно спрошу. - person Ittai Barkai; 02.08.2019

Для тех, кто заинтересован, я также получил это альтернативное решение от Эрика Чакона.

Вы можете просмотреть его руководство здесь для лучшего понимания разработанного им расширения ggplot2, которое используется в этом решении.

    # Installing and loading necessary packages
    install.packages("remotes")
    remotes::install_github("ErickChacon/mbsi")
    library(mbsi)
    library(ggplot2)

    load("timeseries.RData")

    #converting factor to numeric
    plot.timeseries$Index <- as.numeric(levels(plot.timeseries$Index))[plot.timeseries$Index] 

     ggplot(plot.timeseries, aes(Date, Price)) +
        geom_line() +
        stat_events(aes(event = I(1 * (Index > 0)), fill = "Index"),
              threshold = min(plot.timeseries$Price),
              fill = "green", alpha = 0.3) 

График временных рядов

person Ittai Barkai    schedule 04.08.2019