# Slice bivariate densities, or the Joy Division “waterfall plot”

October 8, 2014
By

(This article was first published on Robert Grant's stats blog » R, and kindly contributed to R-bloggers)

This has been on my to-do list for a long old time. Lining up slices through a bivariate density seems a much more intuitive way of depicting it than contour plots or some ghastly rotating 3-D thing (urgh). Of course, there is the danger of features being hidden, but you know I’m a semi-transparency nut, so it’s no surprise I think that’s the answer to this too.

Here’s an R function for you:

```# x, y: data

# slices: number of horizontal slices through the data
# lboost: coefficient to increase the height of the lines
# gboost: coefficient to increase the height of the graph (ylim)
# xinc: horizontal offset for each succesive slice
# (typically something like 1/80)
# yinc: vertical offset for each succesive slice
# bcol: background color
# fcol: fill color for each slice (polygon)
# lcol: line color for each slice
# lwidth: line width
# NB if you want to cycle slice colors through vectors, you
# need to change the function code; it sounds like a
# pretty bad idea to me, but each to their own.

slicedens<-function(x,y,slices=50,lboost=1,gboost=1,xinc=0,yinc=0.01,
bcol="black",fcol="black",lcol="white",lwidth=1) {
ycut<-min(y)+((0:(slices))*(max(y)-min(y))/slices)
height<-gboost*((slices*yinc)+max(density(x)\$y))
plot( c(min(x),max(x)+((max(x)-min(x))/4)),
c(0,height),
xaxt="n",yaxt="n",ylab="",xlab="")
rect(par("usr")[1],par("usr")[3],par("usr")[2],par("usr")[4],col=bcol)
for(i in slices:1) {
miny<-ycut[i]
maxy<-ycut[i+1]
gx<-(i-1)*(max(x)-min(x))*xinc
gy<-(i-1)*(height)*yinc
dd<-density(x[y>=miny & y
Some places call this a waterfall plot. Anyway, the white-on-black color scheme is clearly inspired by the Joy Division album cover. Enjoy.

var vglnk = { key: '949efb41171ac6ec1bf7f206d57e90b8' };

(function(d, t) {
var s = d.createElement(t); s.type = 'text/javascript'; s.async = true;
var r = d.getElementsByTagName(t)[0]; r.parentNode.insertBefore(s, r);
}(document, 'script'));

Related
ShareTweet

R-bloggers.com offers daily e-mail updates about R news and tutorials on topics such as: Data science, Big Data, R jobs, visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...