Heatmaps in R

How to make a heatmap in R with a matrix. Seven examples of colored and labeled heatmaps with custom colorscales.


Plotly Studio: Transform any dataset into an interactive data application in minutes with AI. Sign up for early access now.

Basic Heatmap

library(plotly)
fig <- plot_ly(z = volcano, type = "heatmap")

fig

Categorical Axes

m <- matrix(rnorm(9), nrow = 3, ncol = 3)
fig <- plot_ly(
    x = c("a", "b", "c"), y = c("d", "e", "f"),
    z = m, type = "heatmap"
)

fig

Sequential Colorscales: Greys

The colors argument understands color brewer palettes (see RColorBrewer::brewer.pal.info for valid names).

fig <- plot_ly(z = volcano, colors = "Greys", type = "heatmap")

fig

Custom colorscales

The colors argument also accepts a color interpolation function like colorRamp()

fig <- plot_ly(z = volcano, colors = colorRamp(c("red", "green")), type = "heatmap")

fig

Or, you can do the scaling yourself and use the colorscale attribute directly...

vals <- unique(scales::rescale(c(volcano)))
o <- order(vals, decreasing = FALSE)
cols <- scales::col_numeric("Blues", domain = NULL)(vals)
colz <- setNames(data.frame(vals[o], cols[o]), NULL)
fig <- plot_ly(z = volcano, colorscale = colz, type = "heatmap")

fig

What About Dash?

Dash for R is an open-source framework for building analytical applications, with no Javascript required, and it is tightly integrated with the Plotly graphing library.

Learn about how to install Dash for R at https://dashr.plot.ly/installation.

Everywhere in this page that you see fig, you can display the same figure in a Dash for R application by passing it to the figure argument of the Graph component from the built-in dashCoreComponents package like this:

library(plotly)

fig <- plot_ly() 
# fig <- fig %>% add_trace( ... )
# fig <- fig %>% layout( ... ) 

library(dash)
library(dashCoreComponents)
library(dashHtmlComponents)

app <- Dash$new()
app$layout(
    htmlDiv(
        list(
            dccGraph(figure=fig) 
        )
     )
)

app$run_server(debug=TRUE, dev_tools_hot_reload=FALSE)