---
title: "Transforming coordinate systems"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Transforming coordinate systems}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(collapse = TRUE, fig.width = 7, fig.height = 5, fig.align = "center")
```

<div style="text-align: justify">
`{ggplot2}` has many built-in [coordinate systems](https://ggplot2-book.org/coord.html) which are used to both 1) produce the two-dimensional position of the plotted data and 2) draw custom axes and panel backgrounds. `coord_geo()` uses this second purpose to draw special axes that include timescales. However, __deeptime__ also includes a number of other coordinate systems whose primary function is to modify the way data is plotted. To demonstrate this, we'll first need to load some packages.

```{r message = FALSE}
# Load deeptime
library(deeptime)
# Load ggplot for making plots
# It has some example data too
library(ggplot2)
```

## coord_trans meets coord_flip
One limitation of the traditional `coord_trans()` function in `{ggplot2}` is that you can not flip the axes while also transforming the axes. Historically, you would need to either 1) use `scale_x_continuous()` or `scale_y_continuous()` to transform one or both of your axes (which could result in the untransparent loss of data) in combination with `coord_flip()` or 2) transform your data before supplying it to `ggplot()`. `coord_trans_flip()` accomplishes this without the need for `scales` or transforming your data. It works just like `coord_trans()`, with the added functionality of the axis flip from `coord_flip()`.
```{r}
ggplot(mtcars, aes(disp, wt)) +
  geom_point() +
  coord_trans_flip(x = "sqrt", y = "log10") +
  theme_classic()
```


Note: back in 2020, `{ggplot2}` [updated](https://www.tidyverse.org/blog/2020/03/ggplot2-3-3-0/#bi-directional-geoms-and-stats) all the directional stats and geoms (e.g., boxplots and histograms) to work in both directions based on the aesthetic mapping. This somewhat makes this function redundant, but I still find it useful.

## 2D linear transformations
Another limitation of the traditional `coord_trans()` is that each axis is transformed independently. `coord_trans_xy()` expands this functionality to allow for a two-dimensional linear transformation as generated by `ggforce::linear_trans()`. This allows for rotations, stretches, shears, translations, and reflections. A dummy example using the `?mtcars` dataset from `{ggplot2}` is included below. While applications of this functionality may seem abstract for real data, see the [plotting traits](traits.html) article for a potential real-world application using species trait data.


```{r}
# make transformer
library(ggforce)
trans <- linear_trans(shear(50, 0))

# set up data to be plotted
square <- data.frame(
  disp = c(
    min(mtcars$disp), min(mtcars$disp),
    max(mtcars$disp), max(mtcars$disp)
  ),
  wt = c(
    min(mtcars$wt), max(mtcars$wt),
    max(mtcars$wt), min(mtcars$wt)
  )
)

# plot data normally
library(ggplot2)
ggplot(mtcars, aes(disp, wt)) +
  geom_polygon(data = square, fill = NA, color = "black") +
  geom_point(color = "black") +
  coord_cartesian() +
  theme_classic()
# plot data with transformation
ggplot(mtcars, aes(disp, wt)) +
  geom_polygon(data = square, fill = NA, color = "black") +
  geom_point(color = "black") +
  coord_trans_xy(trans = trans, expand = TRUE) +
  theme_classic()
```

</div>
