使用levelplot替代fill.contour - 如何有效地分配z值

时间:2013-11-15 10:11:01

标签: r lattice levelplot

我想绘制一个函数的水平图作为热图,我不确定我是否以最有效的方式初始化图的网格。目前,我正在使用下面的代码,我想知道grid$z<- wrapper(grid$x,grid$y,MyFunction)是否真的是分配z - 值的最佳方式,假设MyFunction不可能知道该怎么做使用矢量值参数。

library("lattice")
MyFunction <- function(x,y){
  return(
    dnorm(sqrt(x^2+y^2))
    )
}
wrapper <- function(x, y, my.fun, ...) {sapply(seq_along(x), FUN = function(i) my.fun(x[i], y[i], ...))}
meshstep <- 0.5
x<- seq(-20,20,meshstep)
y <-seq(-20,20,meshstep)
grid <- expand.grid(x=x, y=y)
grid$z<- wrapper(grid$x,grid$y,MyFunction)
p<- levelplot(z~x*y, grid, cuts = 10, xlab="",
          ylab="", main="Distance to the Origin", sub="In pretty Colors"
          colorkey = TRUE, region = TRUE)
print(p)

1 个答案:

答案 0 :(得分:0)

如果MyFunction未向量化,您可以使用apply代替wrapper函数:

grid <- expand.grid(x=x, y=y)
grid$z <- apply(grid, 1, FUN=function(XY)MyFunction(XY[1], XY[2]))

如果向量化MyFunction,您可以使用outer

z <- outer(x, y, MyFunction)
grid <- expand.grid(x=x, y=y)
grid$z <- as.vector(z)