---
title: "Examples of lattice corrgrams"
author: "Kevin Wright"
date: "`r Sys.Date()`"
bibliography: corrgram.bib
output: 
  rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Examples of lattice corrgrams}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

## Package overview

The `corrgram` package provides functions for creating corrgrams using three different graphics systems, base, grid, and lattice.

Base R graphics
+ single function `corrgram()` for dataframes or matrices.
+ Enables most features found in the paper by @friendly2002corrgrams.
- No automatic legend.
- Not easily combined with other graphics.

`lattice` graphics
+ Separate panel functions for `lattice::levelplot()` for dataframes and `lattice::splom()` for correlation matrices.
+ Enables automatic legend.
+ Enables corrgrams conditioned on other variables.
+ Can be combined with other lattice graphics for complex figures.
- Not feature complete compared to base R.

`grid` graphics
+ single function `corrgram2()` for either dataframes or correlation matrices. 
+ Enables automatic legend.
+ Can be combined with other grid graphics for complex figures.
- Not feature complete compared to base R.
+ Faster than base R when evaluated inside Positron.

## This vignette

This vignette demonstrates how to create corrgrams using `lattice` graphics, you can use some custom panel functions provided in the `corrgram` package along with the `lattice::splom()` or `lattice::levelplot()` functions. An example of each type of corrgram is shown below.

## Correlation matrix corrgram in lattice

The `levelplot()` function in lattice only has a single plotting region, so does not (by default) suppot upper and lower panels. However, you can write a custom panel function with different glyphs above and below the diagonal. See the `panel.ellipse()` example below.

Using `splom()` makes it easy to include a color scale next to the corrgram.

```{r corrgram-lattice-correlation-matrix, fig.width=6, fig.height=6}
library("lattice")
library("corrgram")

# The easiest way to have an automatic color key is to set the theme
opar <- trellis.par.get()
trellis.par.set(
  regions=list(col=colorRampPalette(c("red","salmon","white","royalblue","navy")))
)

# Create a correlation matrix
library(MASS) # foor Cars93
cor.Cars93 <-   cor(Cars93[, !sapply(Cars93, is.factor)], use = "pair")
ord <- order.dendrogram(as.dendrogram(hclust(dist(cor.Cars93))))
cars93 <- cor.Cars93[ord,ord]
head(cars93)

# lattice corrgram using pie-shaped glyphs
levelplot(cars93, xlab = NULL, ylab = NULL,
          at = do.breaks(c(-1.01, 1.01), 101), panel = levelplot_panel.pie,
          scales = list(x = list(rot = 90)), colorkey = list(space = "top") )

# lattice corrgram using ellipse-shaped glyphs above the diagonal
# and value labels below the diagonal
levelplot(cars93, xlab = NULL, ylab = NULL,
          at = do.breaks(c(-1.01, 1.01), 101), panel = levelplot_panel.ellipse,
          label=TRUE,
          scales = list(x = list(rot = 90)), colorkey = list(space = "top") )

```

## Scatterplot matrix corrgram in lattice

Since the `lattice::splom()` function supports conditioning on a factor, we can use it to create corrgrams that are conditioned on a factor.

The penguins data provides a nice example of Simpson's paradox, where the overall correlation between two variables can be negative, but the correlation within each group (species) can be positive. 

```{r}
pengvars <- c("bill_len", "bill_dep", "flipper_len", "body_mass")
library(lattice)
splom(~penguins[ , pengvars], upper.panel=splom_panel.pie, pscales=0)
splom(~penguins[ , pengvars]|penguins$species, upper.panel=splom_panel.pie, pscales=0)
splom(~penguins[ , pengvars], upper.panel=splom_panel.shade, pscales=0)
splom(~penguins[ , pengvars]|penguins$species, upper.panel=splom_panel.shade, pscales=0)
splom(~penguins[ , pengvars], upper.panel=splom_panel.ellipse, pscales=0)
splom(~penguins[ , pengvars]|penguins$species, upper.panel=splom_panel.ellipse, pscales=0)
```

You can also use the `hexbin` package to create hexagonal binning plots in the upper panels of the scatterplot matrix.  This is useful when you have a large number of points and want to visualize the density of points in different regions of the plot.
```{r}
# Hexbin
library(lattice)
library(hexbin)
splom(~penguins[ , pengvars], upper.panel=hexbin::panel.hexbinplot, pscales=0)
splom(~penguins[ , pengvars]|penguins$species, upper.panel=hexbin::panel.hexbinplot, pscales=0)
```