---
title: "customizing the output from `plot_interaction()`"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{customizing the output from `plot_interaction()}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
EVAL_DEFAULT <- FALSE
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  eval = TRUE
)
```

Since `plot_interaction()` just returns a `ggplot` object, the output be customized using a combination of different `ggplot2` functions.

## Baseline Plot

Here we fit a simple model, and create a baseline plot, which we'll customize.

```{r model}
library(modsem)
library(ggplot2)

m <- '
X =~ x1 + x2 + x3
Z =~ z1 + z2 + z3
Y =~ y1 + y2 + y3

Y ~ X + Z + X:Z
'

fit <- modsem(m, data = oneInt, method = "lms")
p <- plot_interaction(x = "X", z = "Z", y = "Y", vals_z = c(-1, 1), model = fit)
print(p)
```

## Changing Titles and Labels

### Title

The title of the plot can be changed using the `ggtitle()` function.

```{r plot-title, echo=FALSE}
p + ggtitle("This is a new title")
```

### Axis Labels

The axis labels can be changed using the `xlab()` and `ylab()` functions.

```{r axis-labels, echo=FALSE}
p + xlab("This is the x-axis") + ylab("This is the y-axis")
```

### Legend Title

Changing the legend title is a bit trickier, but it can be done using the
`guides()` function. Since `plot_interaction()` uses both the `fill` and `color` aesthetic, both must be specified, with the same title.

```{r}
p + guides(fill=guide_legend(title = "New Legend Title"),
           color=guide_legend(title = "New Legend Title"))
```

## Changing Colors

The colors of both the `fill` and `color` aesthetic can be changed using different functions.

### Greyscale

Here we replace the `fill` aesthetic with a greyscale.

```{r}
p + scale_fill_grey()
```
Here we do the same for the `color` aesthetic.
```{r}
p + scale_color_grey()
```

Combining both, we get a greyscale version of the plot.

```{r}
p + scale_color_grey() + scale_fill_grey()
```

**NOTE**: As of version `1.0.14` there is a separate `greyscale` argument, for using a greyscale theme,
simplifying the process.

### Brewer Color palettes

`ggplot2` comes with a few different color palettes, which we can use to the replace the default color palette. Here we have numerous options (you can also download additional packages), but here we can see a few examples using some of the `brewer` palettes.

To see the available palettes you can run this snippet.

```{r, fig.height = 18, fig.width = 8}
# You might need to install the `RColorBrewer` package
RColorBrewer::display.brewer.all()
```

Here we have an example using the `Dark2` palette.
```{r}
# We need to apply the color scale to both the fill and color aesthetics
p + scale_fill_brewer(palette = "Dark2") +
    scale_color_brewer(palette = "Dark2")
```

Here we have an example using the `Accent` palette.
```{r}
# We need to apply the color scale to both the fill and color aesthetics
p + scale_fill_brewer(palette = "Accent") +
    scale_color_brewer(palette = "Accent")
```

### Custom Color Palettes

It is also possible to use custom/manual color palettes, but this is more cumbersome. Here we see an example.

```{r}
custom_colors = c("#E69F00", "#56B4E9")

p + scale_fill_manual(values = custom_colors) +
    scale_color_manual(values = custom_colors)
```

## Changing Line types

Changing the linetypes is a more compliacted than changing the colors in the plot. This is because we have to add a whole new aesthetic to the plot. This can done using the `aes()` function. Behind the scenes, `modsem` uses a variable `cat_z` to form the groups in the output from `plot_interaction`, which is why we pass `linetype = cat_z`.

```{r}
p + aes(linetype = cat_z)
```
Here we can see that we had an unfortunate side effect, where we created a second Legend in our plot. This can however be fixed by renaming the Legend title (see the [Legend Title] section).

```{r}
p + aes(linetype = cat_z) +
    guides(linetype = guide_legend("Z"))
```

## Combinations

Here we can see an example combining the different options.

```{r}
p +
  ggtitle("Customized Plot") + # New Title
  xlab("Values of X") + # New X-axis label
  ylab("Predicted values of Y") + # New y-axis label
  scale_color_grey() + # Add Grey theem
  scale_fill_grey() +
  aes(linetype = cat_z) + # Add linetypes
  guides(color    = guide_legend("Values of Z"), # Change Legend Title
         fill     = guide_legend("Values of Z"),
         linetype = guide_legend("Values of Z"))
```
