---
title: "Global Aesthetics Mappings and Side Geometries"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Global Aesthetics Mappings and Side Geometries}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r knitr_setup, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.width = 8,
  fig.height = 6,
  out.width = '100%'
)
```

```{r setup}
library(ggside)
```

```{r}
p <- ggplot(mpg, aes(displ, hwy, colour = class)) +
   geom_point(size = 2) +
   theme_bw()
```

The purpose of this vignette is to document a _slight_ change in API expectation with certain `geom_*side*` when there are global aesthetic mappings for both `x` and `y`.

In `ggside (<0.1.0)`, the user was expected to explicitly map all computed aesthetics, especially in the case when `x` and `y` are mapped globally for the main panel. The nature of `ggside` is generally to plot supplemental data, and the user will likely want to inherit the `x` global mapping if they use a `geom_xside*` geometry, but map something different to `y`.

This decision was made in order to keep all `geom_*side*` geometries as similar to their `ggplot2::geom_*` geometry counterparts. However, using `ggside` becomes a tad bit annoying when you must specify _*every*_ positional aesthetic, especially when it obvious what the user may want.

In `ggside (>=0.1.0)`, certain `geom_*side*` geometries will use the default aesthetic mapping of the associated `Stat`, depending on the `orientation` parameter.

For example, `geom_xsidedensity` will ignore the `y` global mapping and assign `y = after_stat(density)` to that layer's aesthetic mappings if no `y` mapping was specified. The same can be said for `geom_ysidedensity`, it will ignore the `x` global mapping and assign `x = after_stat(density)` if no `x` mapping was specified.

This should be much less typing.

```{r ggside_updated_aes_usage}
p + 
  geom_xsidedensity() +
  geom_ysidedensity()
```


Of course, if you would like to use a different computed variables, you will need to specify it like normal.

```{r ggside_aes_stats}
p + 
  geom_xsidedensity(aes(y = after_stat(count))) +
  geom_ysidedensity(aes(x = after_stat(scaled)))
```


You can even use `geom_xsidedensity(orientation = "y")` to force it to inherit the `y` global mapping and map `x = after_stat(density)`. I don't expect many users will do this, but the option is available nonetheless. 

```{r ggside_off_usage_example}
#
p + 
  geom_xsidedensity(orientation = "y") #just use geom_ysidedensity() 
```


## Side Geometries With Functionality

The following `geom_*side*` geometries have been updated such that the default expected behavior is easier to use.

* `geom_*sidedensity`
* `geom_*sidebar`
* `geom_*sidefreqpoly` 
* `geom_*sidehistogram`

This can only be applied to geometries that have a `stat` other than `"identity"` with a `default_aes`. If the geometries have an `orientation` parameter, this can control which aesthetic is inherited. `geom_*sideboxplot` and `geom_*sideviolin` are *not* included in this update because the `orientation` largely depends the aesthetic mapping of the layer, and these two geometries could go either way depending on position scales of `x` and `y`.

All other `geom_*side*` geometries will need their mappings to be explicitly assigned or they will try to inherit from the global mapping (so long as `inherit.aes = TRUE`).
