---
title: "Plotting with exuber"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Plotting with exuber}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  message = FALSE,
  fig.width = 10
)
```

```{r load, echo=FALSE, message=FALSE}
library(exuber)
options(exuber.show_progress = FALSE)
library(dplyr)
library(ggplot2)
library(tidyr)
```

```{r options, echo=FALSE}
options(exuber.parallel = FALSE)
```

### The plotting API has changed in exuber 0.4.0

The new design offers full flexibility and customization to produce publication-ready plots. `exuber` used to plot graph individually in a list, and then you could modify each plot and arrange them into a single grob with `ggarrange()`(which now is defunct). However, newer versions of exuber focus on providing a faceted plot as it easier to change the aesthetics and themes.

Let's start by simulating some data.

```{r tstats-cv}
set.seed(123)
sims <- tibble(
  sim_psy1 = sim_psy1(100),
  sim_psy2 = sim_psy2(100),
  sim_evans = sim_blan(100),
  sim_blan = sim_evans(100),
) 

# Esimation
estimation <- radf(sims, lag = 1)
  
# Critical Values
crit_values <- radf_mc_cv(nrow(sims))
```

## Same Appearance with New Features

The visual output of autoplot in `v0.4.0` is exactly the same as before.

```{r autoplot-basic}
autoplot(estimation, crit_values)
```
However, almost all aspects of the plot can be easily changed.

### Change color and theme

The custom color for autoplot are "blue and "red", however the user can easily override 
this option with `ggplot2::scale_color_manual`.

```{r autoplot-color-theme}
autoplot(estimation, crit_values) +
  scale_color_manual(values = c("grey","black")) + 
  theme_classic()
```

### Changed the shaded region with shade_opt

`shade_opt` allows the user to manipulate the `geom_rect()` layer of the ggplot, using
the `shade` function. Alternatively, it can be omitted if it set to `NULL`.

```{r autoplot-shade}
autoplot(estimation, crit_values, shade_opt = shade(fill = "pink", opacity = 0.3))
```

## Custom plotting

Custom plotting is also very easy with the `augment_join()`, that merge the output 
of the estimation and and critical values in a ggplot2-friendly way.

```{r join-sets}
joined <- augment_join(estimation, crit_values)
joined
```

The output of `augment_join` returns data in tidy format and offers full flexibility to the user. 
After this point plotting becomes extremely trivial.

```{r facet-joined}
joined %>% 
  ggplot(aes(x = index)) +
  geom_line(aes(y = tstat)) +
  geom_line(aes(y = crit)) +
  facet_grid(sig + stat ~  id  , scales = "free_y")
```

We also offer two functions `scale_exuber_manual` and `theme_exuber` that offer some
extra functionality. 

```{r facet-joined-theme-exuber, warning=FALSE}
joined %>%
  pivot_longer(cols = c("tstat", "crit"), names_to = "nms") %>% 
  ggplot(aes(x = index, y = value, col = nms)) +
  geom_line() +
  facet_grid(sig + stat ~  id  , scales = "free_y") +
  scale_exuber_manual() +
  theme_exuber()
```

## Distribution

In addition to critical values, we can also calculate the empirical distribution
by utilizing the family of *_distr functions. For example if we can simulate
the distribution of the supADF tests with Monte Carlo method.

```{r distributions}
distr <- radf_mc_distr(n = 300)
autoplot(distr)
```

### Empirical distribution

This part is made just for fun.

```{r ecdf}
library(tidyr)
distr %>%
  tidy() %>%
  rename_all(~ stringr::str_to_upper(.)) %>%
  gather(Statistic, value, factor_key = TRUE) %>%
  ggplot(aes(value, color = Statistic)) +
  stat_ecdf() +
  ggtitle("Empirical Cumulative Distribution") +
  geom_hline(yintercept = 0.95, linetype = "dashed") + theme_bw()
```

## Old Functionality

To return to the old functionality there are several ways.

```{r lapply-arrange}
library(gridExtra)

# To choose only positive series (i.e. statistically significant for 5%)
positive_series <- diagnostics(estimation, crit_values)$positive 

# Through a loop on positive series 
plot_list1 <- list()
for (as in positive_series) {
  plot_list1[[as]] <- autoplot(estimation, crit_values, select_series = as)
}

# Alternatively  with lapply
plot_list2 <- lapply(positive_series, function(x) autoplot(estimation, crit_values, select_series = x))
names(plot_list2) <- positive_series

do.call(gridExtra::grid.arrange, plot_list1)
```

With the old functionality you had to make changes one at a time
```{r example-old}
plot_list1[[1]] <- plot_list1[[1]] + theme_classic()
```
and then reconstruct the plot with `grid.arrange` or some other function that arranges all plots into a single grob.


Enjoy Plotting with `exuber` !!!
