Within the tidyverse heatmaps can be generated via ggplot2::geom_tile() but is sometimes hard to reach the versatility and beauty of a genuine heatmap function like pheatmap::pheatmap(). tidyheatmaps provides a tidyverse-style interface to the powerful heatmap package pheatmap by @raivokolde and enables the generation of complex heatmaps from tidy data with minimal code.

library(tidyverse)
library(tidyheatmaps)

## Data requirements

tidy_heatmap() requires tidy data in long format, see tidyverse.

As an example we will use the gene expression data set data_exprs. In the tidyverse lingo the columns of a data frame are called variables. The variable expression contains the numeric values to be color-coded in the heatmap. Furthermore we will use the variables sample for heatmap columns and external_gene_name for heatmap rows.

glimpse(data_exprs)
#> Rows: 800
#> Columns: 9
#> $ensembl_gene_id <chr> "ENSMUSG00000033576", "ENSMUSG00000033576", "ENSMUS… #>$ external_gene_name <chr> "Apol6", "Apol6", "Apol6", "Apol6", "Apol6", "Apol6…
#> $sample <chr> "Hin_1", "Hin_2", "Hin_3", "Hin_4", "Hin_5", "Ein_1… #>$ expression         <dbl> 2.203755, 2.203755, 2.660558, 2.649534, 3.442740, 5…
#> $group <chr> "Hin", "Hin", "Hin", "Hin", "Hin", "Ein", "Ein", "E… #>$ sample_type        <chr> "input", "input", "input", "input", "input", "input…
#> $condition <chr> "healthy", "healthy", "healthy", "healthy", "health… #>$ is_immune_gene     <chr> "no", "no", "no", "no", "no", "no", "no", "no", "no…
#> \$ direction          <chr> "up", "up", "up", "up", "up", "up", "up", "up", "up…

## Basic usage

The basic layout of the heatmap relies on the parameters rows, columns and values. You can think of them like aesthetics in ggplot2::ggplot(), similar to something like aes(x = columns, y = rows, fill = values).

tidy_heatmap(data_exprs,
rows = external_gene_name,
columns = sample,
values = expression
)

## Data scaling

With the parameter scale you can activate data scaling for "row" or "column". By default data scaling is turned off scale = "none".

tidy_heatmap(data_exprs,
rows = external_gene_name,
columns = sample,
values = expression,
scale = "row"
)

## Ordering

Rows and columns in the heatmap will appear in the same order as in the tidy data frame used as input. For example, to order rows and columns alphabetically, just use the dplyr::arrange().

data_exprs %>%
arrange(external_gene_name, sample) %>%
tidy_heatmap(rows = external_gene_name,
columns = sample,
values = expression,
scale = "row"
)

## Color legend

You can customize the number of colors color_legend_n in the color legend. The default is 15.

tidy_heatmap(data_exprs,
rows = external_gene_name,
columns = sample,
values = expression,
scale = "row",
color_legend_n = 5
)

You can also define the minimum and maximum values of the color legend. Values smaller then the color_legend_min will have the lowest color, values bigger than the color_legend_max will get the highest color.

tidy_heatmap(data_exprs,
rows = external_gene_name,
columns = sample,
values = expression,
scale = "row",
color_legend_min = -1,
color_legend_max = 1
)

Of course, you can also change the colors themselves. The number of colors you provide does not have to match color_legend_n. The color legend is automatically adjusted to have color_legend_n colors (the default is 15).

tidy_heatmap(data_exprs,
rows = external_gene_name,
columns = sample,
values = expression,
scale = "row",
colors = c("#145afc","#ffffff","#ee4445")
)

## Annotations

Annotations can be added for both rows and columns via annotation_row and annotation_col, respectively. Just specify the corresponding variables in the tidy data frame. If you want more then one variable for annotation just combine them by c(var1, var2, var3).

tidy_heatmap(data_exprs,
rows = external_gene_name,
columns = sample,
values = expression,
scale = "row",
annotation_col = c(sample_type, condition, group),
annotation_row = c(is_immune_gene, direction)
)

### Customize annotations colors

You can provide a list of named vectors to take control over the annotations colors annotation_colors.

ann_colors <- list(
condition = c(EAE = "#BD79B4", healthy = "#F5CEF2"),
group = c(Ein = "#C14236", Eip = "#E28946", Hin = "#4978AB", Hip = "#98BB85"),
sample_type = c(input = "#BDBDBD", IP = "#7D7D7D"),
direction = c(down = "#5071DC", up = "#C34B6B"),
is_immune_gene = c(yes = "#B69340", no = "#FFFFFF")
)

tidy_heatmap(data_exprs,
rows = external_gene_name,
columns = sample,
values = expression,
scale = "row",
annotation_col = c(sample_type, condition, group),
annotation_row = c(is_immune_gene, direction),
annotation_colors = ann_colors
)

## Gaps

Gaps can be added by specifying data frame variables that should be used to generate the gaps. Only one variable can be chosen for each gaps_row and gaps_col.

tidy_heatmap(data_exprs,
rows = external_gene_name,
columns = sample,
values = expression,
scale = "row",
annotation_col = c(sample_type, condition, group),
annotation_row = c(is_immune_gene, direction),
annotation_colors = ann_colors,
gaps_row = direction,
gaps_col = group
)

## Cell dimensions

You can provide absolute cell dimensions (in points) via the cellwidth and cellheight parameters.

tidy_heatmap(data_exprs,
rows = external_gene_name,
columns = sample,
values = expression,
scale = "row",
annotation_col = c(sample_type, condition, group),
annotation_row = c(is_immune_gene, direction),
annotation_colors = ann_colors,
gaps_row = direction,
gaps_col = group,
cellwidth = 7,
cellheight = 7
)

## Show selected labels

To highlight a selection of row or column labels while hiding the rest, you can use show_selected_row_labels or show_selected_col_labels, respectively.

tidy_heatmap(data_exprs,
rows = external_gene_name,
columns = sample,
values = expression,
scale = "row",
annotation_col = c(sample_type, condition, group),
annotation_row = c(is_immune_gene, direction),
annotation_colors = ann_colors,
gaps_row = direction,
gaps_col = group,
cellwidth = 7,
cellheight = 7,
show_selected_row_labels = c("Apol6","Bsn","Vgf","Fam96b","Bag1","Aip"),
)

## Write to file

You can use the parameter filename to write the heatmap to file.

tidy_heatmap(data_exprs,
rows = external_gene_name,
columns = sample,
values = expression,
filename = "my_heatmap.pdf"
)

## More features

pheatmap provides even more features like clustering, dendrograms, text within cells, et cetera. Additional available parameters can be found in the documentation of tidy_heatmap().

tidy_heatmap(data_exprs,
rows = external_gene_name,
columns = sample,
values = expression,
scale = "row",
cluster_rows = TRUE,
cluster_cols = TRUE,
display_numbers = TRUE
)