---
title: "Getting Started with 'gggrid'"
output:
  html_document
vignette: >
  %\VignetteIndexEntry{Getting Started with 'gggrid'}
  %\VignetteEngine{knitr::rmarkdown}
  \usepackage[utf8]{inputenc}
bibliography: gggrid.bib
---

The 'gggrid' package provides two functions: `grid_panel()`
and `grid_group()`.  Both functions add 'grid' output to 
a 'ggplot2' plot.

The `grid_panel()` function is called once for each panel
in a (facetted) 'ggplot2' plot and the `grid_group()` function
is called once for each group in a 'ggplot2' plot.

The first argument to both functions can be a 'grid' grob.
For example, the following code defines a text grob that will
be drawn 5mm in from the top-right corner of wherever it is drawn.


```{r}
library(grid)
label <- textGrob("Label", 
                  x=unit(1, "npc") - unit(5, "mm"),
                  y=unit(1, "npc") - unit(5, "mm"),
                  just=c("right", "top"))
```

The following code calls `grid_panel()` to add that text label
to a 'ggplot2' plot.

```{r fig.width=5, fig.height=3}
library(gggrid)
ggplot(mtcars) + 
    geom_point(aes(disp, mpg)) +
    grid_panel(label)
```

The first argument to both functions can also be a function
that generates a grob.  The function must accept two arguments,
`data` and `coords`, which contain the data values (and transformed
data values) for the 'ggplot2' panel that is being drawn.
For example, the following code adds a "rug" of short lines
showing the distribution of the y-values in the plot.

```{r fig.width=5, fig.height=3}
rug <- function(data, coords) {
    segmentsGrob(unit(1, "npc"),
                 coords$y,
                 unit(1, "npc") - unit(2, "mm"),
                 coords$y,
                 gp=gpar(lwd=2, col=rgb(0,0,0,.5)))
}
ggplot(mtcars, aes(x=disp, y=mpg)) +
    geom_point() +
    grid_panel(rug)
```

The following code adds facetting to
demonstrate that `grid_panel()` is called once
for panel.

```{r fig.width=5, fig.height=3}
ggplot(mtcars, aes(x=disp, y=mpg)) +
    geom_point() +
    grid_panel(rug) +
    facet_wrap("am")
```

The following code adds grouping to demonstrate that
`grid_group()` is called once for each group.

```{r fig.width=5, fig.height=3}
rugGroup <- function(data, coords) {
    segmentsGrob(unit(1, "npc"),
                 coords$y,
                 unit(1, "npc") - unit(2, "mm"),
                 coords$y,
                 gp=gpar(lwd=2, col=adjustcolor(data$colour, alpha=.5)))
}
ggplot(mtcars, aes(x=disp, y=mpg, colour=as.factor(am))) +
    geom_point() +
    grid_group(rugGroup)
```

The following code demonstrates that 'gggrid' is one way to access
'grid'-based drawing that is not (yet) available via 'ggplot2'-based
`geom_*()` functions.  In this case, we make use of variable-width
lines from the 'vwline' package.

```{r fig.width=5, fig.height=2}
minard <- read.table("minard-troops.txt", header=TRUE)
library(vwline)
path <- function(data, coords) {
    vwlineGrob(coords$x, coords$y, w=unit(coords$size, "in"),
               gp=gpar(col=coords$colour[1],
                       fill=adjustcolor(coords$colour[1], alpha=.5)))
}
ggplot(minard, 
       aes(x=long, y=lat, size=survivors, colour=direction, 
           group=interaction(group, direction))) + 
    scale_size(range=c(.01, .5)) +
    coord_fixed(2, clip="off") +
    grid_group(path)
```

The above plot has no legend, but it is possible to add one
with a little more work.  There are three important steps:

1. Set `show.legend=TRUE`
1. Set `key_glyph` to be a function that produces a grob 
   (to draw an item in the legend)
1. Set an explicit mapping in the `grid_group()` call
   (rather than just having `grid_group()` inherit a mapping).

The following code demonstrates these steps, including defining 
a `path_key()` function that draws a variable-width line
in the legend, to show the relationship between `colour`
and `direction`.

We have excluded the `size` legend in this case
(with `guide="none"`) to keep the `path_key()` function relatively simple.  

```{r fig.width=6, fig.height=2}
path_key <- function(data, ...) {
    vwlineGrob(0:1, c(.5, .5), w=unit(c(.1, .2), "in"),
               gp=gpar(col=data$colour, 
                       fill=adjustcolor(data$colour, alpha=.5)))
}
ggplot(minard) + 
    scale_size(range=c(.01, .5), guide="none") +
    coord_fixed(2, clip="off") +
    grid_group(path, 
               aes(x=long, y=lat, size=survivors, colour=direction, 
                   group=interaction(group, direction)),
               show.legend=TRUE, 
               key_glyph=path_key)
```

The Minard data used in the example above comes from 
the supplementary materials that were published with
@wickham-GoG.

## References


