[英]Add points and colored surface to locfit perspective plot
我有一个locfit
模型的透视图,我想在其中添加两点
首先,我尝试使用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
(虽然很难,但很笨拙)。
您可以将其放入一个函数中,以便您可以重用它。 我们:
所以:
# 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.