# Scatterplot with contour/heat overlay

I saw this plot in the supplement of a recent paper and I'd love to be able to reproduce it using R. It's a scatterplot, but to fix the overplotting there are contour lines that are "heat" colored blue to red corresponding to the overplotting density. How would I do this?

## locked by whuber♦Mar 19 at 4:12

This question exists because it has historical significance, but it is not considered a good, on-topic question for this site, so please do not use it as evidence that you can ask similar questions here. This question and its answers are frozen and cannot be changed. More info: help center.

• This StackOverflow questions shows a couple of ggplot2 options for this kind of plot, including the scatterplot+points. – joran Jul 6 '12 at 4:56

Here is my take, using base functions only for drawing stuff:

library(MASS)  # in case it is not already loaded
set.seed(101)
n <- 1000
X <- mvrnorm(n, mu=c(.5,2.5), Sigma=matrix(c(1,.6,.6,1), ncol=2))

## some pretty colors
library(RColorBrewer)
k <- 11
my.cols <- rev(brewer.pal(k, "RdYlBu"))

## compute 2D kernel density, see MASS book, pp. 130-131
z <- kde2d(X[,1], X[,2], n=50)

plot(X, xlab="X label", ylab="Y label", pch=19, cex=.4)
abline(h=mean(X[,2]), v=mean(X[,1]), lwd=2)
legend("topleft", paste("R=", round(cor(X)[1,2],2)), bty="n")


For more fancy rendering, you might want to have a look at ggplot2 and stat_density2d(). Another function I like is smoothScatter():

smoothScatter(X, nrpoints=.3*n, colramp=colorRampPalette(my.cols), pch=19, cex=.8)


• Would be nice if one could control the contour plot to include specified quantiles/percentiles/deciles (or what have you). – Roman Luštrik Apr 1 '13 at 13:04
• Awsesome, I've been looking for smth like that for a long time, good quality plot – WAF Jul 30 '14 at 10:14

No-one has suggested ggplot2 for this??

library(MASS)
library(ggplot2)
n <- 1000
x <- mvrnorm(n, mu=c(.5,2.5), Sigma=matrix(c(1,.6,.6,1), ncol=2))
df = data.frame(x); colnames(df) = c("x","y")

commonTheme = list(labs(color="Density",fill="Density",
x="RNA-seq Expression",
y="Microarray Expression"),
theme_bw(),
theme(legend.position=c(0,1),
legend.justification=c(0,1)))

ggplot(data=df,aes(x,y)) +
geom_density2d(aes(colour=..level..)) +
geom_point() + commonTheme


Which produces the following:

However, other stuff can be done too, quite easily, such as the following:

ggplot(data=df,aes(x,y)) +
stat_density2d(aes(fill=..level..,alpha=..level..),geom='polygon',colour='black') +
scale_fill_continuous(low="green",high="red") +
geom_smooth(method=lm,linetype=2,colour="red",se=F) +
guides(alpha="none") +
geom_point() + commonTheme


Which produces the following: