November 03, 2009

You can follow this conversation by subscribing to the comment feed for this post.

Nice thanks! It's amazing how giving the R community is. Thanks for the blog.

Here's a quick rendition in ggplot2:

stock.data <- transform(stock.data,
week = as.POSIXlt(Date)$yday %/% 7 + 1, wday = as.POSIXlt(Date)$wday,
year = as.POSIXlt(Date)$year + 1900) library(ggplot2) ggplot(stock.data, aes(week, wday, fill = Adj.Close)) + geom_tile(colour = "white") + scale_fill_gradientn(colours = c("#D61818","#FFAE63","#FFFFBD","#B5E384")) + facet_wrap(~ year, ncol = 1)  But maybe a better display of the same data is : qplot(week, Adj.Close, data = stock.data, colour = factor(wday), geom = "line") + facet_wrap(~ year, ncol = 1) Your package allows such concise definition of graphics Hadley. This really demonstrates the power of your paradigm for ggplot yet again. Neat! I just used it to chart my iPhone app sales over time: http://blog.planetaryscale.com/2009/11/04/iphone-app-sales-heatmap/ Would be interesting to see the % daily change (instead of closing price) in this format. A bug in merge used in original sourceode shifts data one day. Instead use this: # Merge moves data by one day, avoid caldat <- data.frame(date.seq = seq(min.date, max.date, by="days"), value = NA) dates <- as.Date(dates) caldat$value[match(dates, caldat$date.seq)] <- values Very nice. Even better - hook this into a web application, make the heat map a clickable image map taking you to data for that date. Thanks for showcasing this great tool. I outlined it in a blog on machine learning trading methods, and made a small modification to evaluate %daily changes, instead of price values. Tks for posting and share this tool. I'm going to use in meteorology. Thank you. Nice, Would you consider adding this in the R Graph Gallery ? Very appealing graphic. An optional argument to set the color range, such as ylim=c(nn,nn), would allow several calendar heat maps to be produced with the same color scale. This modification appears to be challenging. One sloppy way to establish a y range would be to input a dummy data value at an obviously false date. When testing this I get the following error (RStudio 0.94.110 running R 2.14.0): calendarHeat(stock.data$Date, stock.data$Adj.Close, varname="MSFT Adjusted Close") Error in compute.layout(x$layout, cond.max.levels, skip = x\$skip) :

Any ideas how to fix this? Seems it is the first call to print which gives this error.

Robert,

If you're using this with the "2006-01-12" start date that's used in the example, then you will exceed the max levels allowed by the print call.

Try again with a more recent start date and you should be fine...

Is there a quick fix how to alter the heat map calendar to Mon first, Sun last layout? Thanks

Can some one help in getting tooltips built into this heat map using library(sendplot) so that upon clicking the cell corresponding to a date, I can see the High/Low of the stock on that date?
An example code to do the above would be greatly welcomed.

Vijayan-you should be able to modify the code in the tutorial vignette to do what you need.

carsX = as.matrix(mtcars)
carsX <- sweep(carsX, 2, colMeans(carsX, na.rm = T))
sx <- apply(carsX, 2, sd, na.rm = T)
carsX <- sweep(carsX, 2, sx, "/")
x = 1:dim(carsX)[2] ; y = 1:dim(carsX)[1] ; z = t(carsX)
plot.call = "image(x=x,y=y, z=z,
axes = FALSE, xlab = '', ylab = '');
axis(1,1:dim(carsX)[2],
labels=colnames(carsX),
las = 2, line = -0.5, tick = 0,cex.axis =1);
axis(4,1:dim(carsX)[1],
labels=rownames(carsX),
las = 2, line = -0.5, tick = 0,cex.axis =.8)"
mai.mat = matrix(c(1,.2,.2,1.5), ncol=4)
mai.prc = FALSE
xy.labels=list(value=round(carsX,3))
x.labels=data.frame(
label=colnames(carsX),
description=c("Miles/(US) gallon","Number of cylinders",
"Displacement (cu.in.)",
"Gross horsepower",
"Rear axle ratio",
"Weight (lb/1000)",
"1/4 mile time",
"V/S",
"Transmission (0 = automatic, 1 = manual)",
"Number of forward gears",
"Number of carburetors")
)
imagesend(plot.call=plot.call,
y.pos=y,x.pos=x,
mai.mat=mai.mat, mai.prc=mai.prc,
xy.type="image.midpoints",
x.labels=x.labels,
xy.labels = xy.labels,
image.size="800x600",
fname.root="exPlotImage",
font.size=18)

A simple fix to deal with the "Inadmissible value of layout" error is to replace:

layout = c(1, nyr%%7)

with

layout = c(1, nyr)

in the source. To accommodate the extra levels, you could decrease the spacing between levels slightly:

between = list(x=0, y=c(0.5, 0.5))

Alternatively, using:

layout = c(1, 7, nyr/7)

yields a multi-page plot, but would need to be tweaked to allow trellis.panelArgs() to function correctly.

The comments to this entry are closed.

Search Revolutions Blog

Got comments or suggestions for the blog editor?
Email David Smith.