# Transforming coordinate systems

`{ggplot2}` has many built-in coordinate systems 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.

    # 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()`.

    ggplot(mtcars, aes(disp, wt)) +
      geom_point() +
      coord_trans_flip(x = "sqrt", y = "log10") +
      theme_classic()

Note: back in 2020, `{ggplot2}` updated 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 article for a potential real-world application using species trait data.

    # 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()