将点和彩色表面添加到 locfit 透视图中

Add points and colored surface to locfit perspective plot

我有一个 locfit 模型的透视图,我想向其中添加两件事

  1. 预测变量作为 3D 中的点space
  2. 根据Z轴值给表面着色

首先,我尝试使用trans3d函数。但是即使我的变量是矢量格式,我也会收到以下错误:

Error in cbind(x, y, z, 1) %*% pmat : requires numeric/complex matrix/vector arguments

这是我的代码片段

library(locfit)    
    X <- as.matrix(loc1[,1:2])
    Y <- as.matrix(loc1[,3])  
    zz <- locfit(Y~X,kern="bisq")
    pmat <- plot(zz,type="persp",zlab="Amount",xlab="",ylab="",main="Plains",
         phi = 30, theta = 30, ticktype="detailed")

    x1 <- as.vector(X[,1])
    x2 <- as.vector(X[,2])
    Y <- as.vector(Y)
    points(trans3d(x1,x2,Y,pmat))

我的 "loc1" 数据可以在这里找到 - https://www.dropbox.com/s/0kdpd5hxsywnvu2/loc1_amountfreq.txt?dl=0

TL,DR: plot.locfit 中没有,但你可以重建它。

我认为 plot.locfit 对这种自定义没有很好的支持。据说 plot 调用中的 get.data=T 将绘制原始数据点(第 1 点),而且它似乎确实如此,except if type="persp" .所以那里没有运气。或者,您可以像您所做的那样 points(trans3d(...)),除非您需要由 persp 编辑的透视矩阵 return,而 plot.locfit.3d 不需要 return。再次,运气不好。

对于着色,通常您会制作一个色标 (http://r.789695.n4.nabble.com/colour-by-z-value-persp-in-raster-package-td4428254.html) 并为每个 z 面指定与之对应的颜色。但是,为此您需要表面的 z 值(而不是原始数据的 z 值),并且 plot.locfit 也不会出现在 return 中。

因此,要想做自己想做的事,您实际上需要自己重新编码 plot.locfit(不难,虽然有点笨拙)。

您可以将它放入一个函数中,以便您可以重用它。 我们:

  1. 制作一个统一的 x-y 点网格
  2. 计算每个点的拟合值
  3. 使用这些绘制表面(带有色标),保存透视矩阵以便我们可以
  4. 绘制原始数据

所以:

# make a grid of x and y coords, calculate the fit at those points
n.x <- 20 # number of x points in the x-y grid
n.y <- 30 # number of y points in the x-y grid
zz <- locfit(Total ~ Mex_Freq + Cal_Freq, data=loc1, kern="bisq")
xs <- with(loc1, seq(min(Mex_Freq), max(Mex_Freq), length.out=20))
ys <- with(loc1, seq(min(Cal_Freq), max(Cal_Freq), length.out=30))
xys <- expand.grid(Mex_Freq=xs, Cal_Freq=ys)
zs <- matrix(predict(zz, xys), nrow=length(xs))

# generate a colour scale
n.cols <- 100 # number of colours
palette <- colorRampPalette(c('blue', 'green'))(n.cols) # from blue to green
# palette <- colorRampPalette(c(rgb(0,0,1,.8), rgb(0,1,0,.8)), alpha=T)(n.cols) # if you want transparency for example
# work out which colour each z-value should be in by splitting it
#  up into n.cols bins
facetcol <- cut(zs, n.cols)

# draw surface, with colours (col=...)
pmat <- persp(x=xs, y=ys, zs, theta=30, phi=30, ticktype='detailed', main="plains", xlab="", ylab="", zlab="Amount", col=palette[facetcol])

# draw your original data
with(loc1, points(trans3d(Mex_Freq,Cal_Freq,Total,pmat), pch=20))

注意 - 看起来不那么漂亮!可能想要调整你的色标颜色,或者小平面的透明度等。回复:添加图例,有一些 other questions 可以处理这个问题。

(PS: ggplot 不做 3D 散点图真可惜。)