繁体   English   中英

在locfit透视图中添加点和有色表面

[英]Add points and colored surface to locfit perspective plot

我有一个locfit模型的透视图,我想在其中添加两点

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

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

cbind(x,y,z,1)%*%pmat中的错误:需要数字/复杂矩阵/矢量参数

这是我的代码片段

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),并且确实如此, 除非 type="persp" 所以那里没有运气。 或者,您可以像已经完成的那样points(trans3d(...)) ,除了需要由persp返回的透视矩阵,而plot.locfit.3d不会返回它。 再说一次,没有运气。

对于着色,通常您要创建一个色标( http://r.789695.n4.nabble.com/colour-by-z-value-persp-in-raster-package-td4428254.html ),然后将随之而来的颜色。 但是,您为此需要曲面的z值(而不是原始数据的z值),并且plot.locfit似乎也不返回此值。

因此,要做您想做的事情,本质上是您自己重新编码plot.locfit (虽然很难,但很笨拙)。

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

  1. 制作均匀的xy点网格
  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))

注意-看起来不太漂亮! 可能需要调整您的色标颜色或刻面的透明度等。回复:添加图例,还有其他一些问题可以解决。

在此处输入图片说明

(PS:可耻的ggplot不能做3D散点图。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM