R levelplot adjust axes

Patrick picture Patrick · Jul 11, 2013 · Viewed 16.6k times · Source

I want to plot the probability distribution function (PDF) as a heatmap in R using the levelplot function of the "lattice" package. I implemented PDF as a function and then generated the matrix for the levelplot using two vectors for the value ranges and the outer function. I want the axes to display the My issue is that am not able to add properly spaced tickmarks on the two axes displaying the two actual value ranges instead of the number of columns or rows, respectively.

# PDF to plot heatmap
P_RCAconst <- function(x,tt,D)
  {
    1/sqrt(2*pi*D*tt)*1/x*exp(-(log(x) - 0.5*D*tt)^2/(2*D*tt))
  }

# value ranges & computation of matrix to plot
tt_log <- seq(-3,3,0.05)
tt <- exp(tt_log)
tt <- c(0,tt)
x <- seq(0,8,0.05)
z <- outer(x,tt,P_RCAconst, D=1.0)
z[,1] <- 0
z[which(x == 1),1] <- 1.5
z[1,] <- 0.1

# plot heatmap using levelplot
require("lattice")
colnames(z) <- round(tt, 2)
rownames(z) <- x
levelplot(z, cex.axis=1.5, cex.lab=1.5, col.regions=colorRampPalette(c("blue", "yellow","red", "black")), at=seq(0,1.9,length=200), xlab="x", ylab="time t", main="PDF P(x,t)")

Without assigning names to columns and rows I receive the following plot where the tick marks are naturally spaced (as used from other R-functions) but the values are the row & column numbers: Without assigning names to columns and rows I receive the following plot where the tick marks are naturally spaced (as used from other R-functions) but the values are the row & column numbers

With assigning names to columns and rows I receive the following plot where the tick marks are not at all readable but at least correspond to the actual values:

With assigning names to columns and rows I receive the following plot where the tick marks are not at all readable but at least correspond to the actual values

I have spent already too much time on this seemingly trivial issue so I would appreciate very much any help from your side!

Answer

baptiste picture baptiste · Jul 11, 2013

Maybe this basic example can help,

d = data.frame(x=rep(seq(0, 10, length=nrow(volcano)), ncol(volcano)), 
               y=rep(seq(0, 100, length=ncol(volcano)), each=nrow(volcano)), 
               z=c(volcano))

library(lattice)

# let lattice pick pretty tick positions
levelplot(z~x*y, data=d)

# specific tick positions and labels
levelplot(z~x*y, data=d, scales=list(x=list(at=c(2, 5, 7, 9), 
                                            labels=letters[1:4])))

# log scale
levelplot(z~x*y, data=d, scales=list(y=list(log=TRUE)))

It's all described in ?xyplot, though admittedly it is a long page of documentation.