---
title: "Publication-ready correlation plots"
author: "Alboukadel Kassambara"
output:
  rmarkdown::html_vignette:
    toc: true
    toc_depth: 2
    fig_width: 6
    fig_height: 5
vignette: >
  %\VignetteIndexEntry{Publication-ready correlation plots}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  message = FALSE,
  warning = FALSE,
  dpi = 150,
  fig.align = "center",
  out.width = "80%"
)
```

This is a **gallery of finished figures** — each with the code that produces it — for the kinds of
correlograms that show up in papers. For the argument-by-argument tour of every option, see
`vignette("ggcorrplot")`.

Two facts make ggcorrplot well suited to publication work: it takes a correlation matrix you already have
(so it never gets between you and your statistics), and it returns a plain **ggplot object**, so any figure
here can be restyled, titled, and combined with `+`.

```{r}
library(ggcorrplot)
library(ggplot2)

data(mtcars)
corr <- round(cor(mtcars), 1)
p.mat <- cor_pmat(mtcars)
```

# The clustered correlogram

The workhorse figure: reorder the variables by hierarchical clustering so correlated variables sit
together and the block structure is visible, and draw thin white separators between cells.

```{r clustered, fig.width = 6, fig.height = 5.4}
ggcorrplot(corr, hc.order = TRUE, outline.color = "white")
```

# Lower triangle with coefficients

For a symmetric matrix the two triangles are redundant, so a paper usually shows one, often with the
coefficients printed in the cells — a figure that replaces a correlation table.

```{r lower-lab, fig.width = 6, fig.height = 5.4}
ggcorrplot(corr, hc.order = TRUE, type = "lower", lab = TRUE, lab_size = 3)
```

# Marking significance

Supply the p-value matrix from `cor_pmat()` and choose how to convey significance. `insig = "blank"`
drops the non-significant cells; `insig = "stars"` instead marks the **significant** ones with
`*`/`**`/`***` — a standalone significance map.

```{r significance, fig.show = "hold", out.width = "48%", fig.align = "default", fig.width = 5.4, fig.height = 5}
# non-significant cells left blank
ggcorrplot(corr, hc.order = TRUE, type = "lower", p.mat = p.mat, insig = "blank")
# significant cells starred
ggcorrplot(corr, p.mat = p.mat, insig = "stars")
```

The default, `insig = "pch"`, crosses out the non-significant cells with an `X` instead.

# Circles for magnitude

`method = "circle"` encodes the correlation with the circle's area, so strong correlations pop out — the
familiar corrplot look, drawn in ggplot2.

```{r circle, fig.width = 6, fig.height = 5.4}
ggcorrplot(corr, method = "circle", hc.order = TRUE, type = "upper", outline.color = "white")
```

# Size-scaled squares

`scale.square = TRUE` sizes the squares by the absolute correlation, so magnitude is encoded by both area
and color at once — the classic corrplot square look. Near-zero cells shrink to small squares while the
strong correlations dominate, which reads well for large matrices and for colorblind viewers.

```{r scale-square, fig.width = 6, fig.height = 5.4}
ggcorrplot(corr, scale.square = TRUE, hc.order = TRUE, outline.color = "white")
```

# corrplot-style boxed cells

`cell.grid = TRUE` draws a light rectangle around every cell and drops the
gridlines that otherwise run through the glyph centers, so each sized glyph sits
inside its own box. Combined with `scale.square = TRUE` (or `method = "circle"`)
this is the boxed-cell corrplot signature, drawn in ggplot2. It has no effect on
a plain full-tile square heatmap, whose cells already have a border.

```{r cell-grid, fig.show = "hold", out.width = "48%", fig.align = "default", fig.width = 5.4, fig.height = 5}
# size-scaled squares in boxed cells
ggcorrplot(corr, scale.square = TRUE, cell.grid = TRUE, hc.order = TRUE, outline.color = "white")
# circles in boxed cells
ggcorrplot(corr, method = "circle", cell.grid = TRUE, hc.order = TRUE)
```

# A colorblind-safe palette

`preset = "publication"` is a one-token beautiful default (white separators + the colorblind-safe RdBu
palette). For a specific journal look, set `colors` and `ggtheme` yourself.

```{r palette, fig.show = "hold", out.width = "48%", fig.align = "default", fig.width = 5.4, fig.height = 5}
# one-token publication preset
ggcorrplot(corr, hc.order = TRUE, preset = "publication")
# a custom diverging palette on a minimal theme
ggcorrplot(corr,
  hc.order = TRUE, type = "lower", outline.color = "white",
  ggtheme = theme_minimal, colors = c("#6D9EC1", "white", "#E46726")
)
```

# A clean, edgeless heatmap

A correlogram of solid colored squares with **no cell border** — the look used in many module–trait and
omics papers. `method = "square"` is a full-tile heatmap; `outline.color = NA` removes the border. Reverse
the default gradient to `c("red", "white", "blue")` for red-negative / blue-positive, and put the variable
names on top with a one-line scale.

```{r edgeless, fig.width = 6, fig.height = 5.6}
ggcorrplot(corr,
  outline.color = NA,
  colors = c("red", "white", "blue"),
  legend.title = "Correlation"
) +
  scale_x_discrete(position = "top")
```

# A rectangular predictor-by-outcome matrix

Correlations are not always a square symmetric matrix. To relate one set of variables to another — say
engine/size variables against performance variables — pass a **rectangular** correlation matrix. Clustering
and the triangle options need a square matrix, so use `hc.order = FALSE`.

```{r rectangular, fig.width = 6.5, fig.height = 4.4}
rect <- round(cor(
  mtcars[, c("mpg", "hp", "wt", "qsec")],
  mtcars[, c("disp", "drat", "vs", "am", "gear")]
), 1)
ggcorrplot(rect, hc.order = FALSE, lab = TRUE, outline.color = "white")
```

# Going further: it is a ggplot

Because `ggcorrplot()` returns a ggplot object, anything ggplot2 can do is available. Start from any
correlogram and add a title, a clearer legend label, and theme tweaks; then save at print resolution.

The legend label is a ggcorrplot argument (`legend.title`); the title, subtitle and theme come from ggplot2.

```{r polish, fig.width = 6, fig.height = 5.8}
p <- ggcorrplot(corr,
  hc.order = TRUE, type = "lower", outline.color = "white",
  legend.title = "Pearson r"
) +
  labs(
    title = "Correlations among car-design variables",
    subtitle = "mtcars, Pearson correlation"
  ) +
  theme(plot.title = element_text(face = "bold"))
p
```

```{r save, eval = FALSE}
ggsave("correlogram.png", p, width = 7, height = 6, dpi = 300)
```

# Session information

```{r session}
sessionInfo()
```
