5

I'd like to make a true heat map in R, much like a weather map, except my data is much more simple.

Consider this 3d data:

x <- c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4)
y <- c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5)
z <- rnorm(20)

The z would be color.

Here is what a discrete looking heatmap would like for this data: enter image description here

How can I make a heatmap such that the colors are smooth and the full 2d space is filled with smoothed out colors based on the z values.

Please include sample code, not just a link that will probably confuse me even more, and I've probably already visited that site anyhow. Thanks :)

CodeGuy
  • 28,427
  • 76
  • 200
  • 317

2 Answers2

14

Use the following:

interp in the akima package

image.plot in the fields package

x <- c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4)
y <- c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5)
z <- rnorm(20)

library(fields)
library(akima)

s <- interp(x,y,z)
image.plot(s)
screechOwl
  • 27,310
  • 61
  • 158
  • 267
2

smooth.2d in the fields package does a good job (and it is much faster than interp from akima package for larger number of input points.

library(fields)

x <- c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4)
y <- c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5)
z <- rnorm(20)

s = smooth.2d(z, x=cbind(x,y), theta=0.5)
image.plot(s)
Viliam Simko
  • 1,711
  • 17
  • 31