将点和彩色表面添加到 locfit 透视图中
Add points and colored surface to locfit perspective plot
我有一个 locfit
模型的透视图,我想向其中添加两件事
- 预测变量作为 3D 中的点space
- 根据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
(不难,虽然有点笨拙)。
您可以将它放入一个函数中,以便您可以重用它。
我们:
- 制作一个统一的 x-y 点网格
- 计算每个点的拟合值
- 使用这些绘制表面(带有色标),保存透视矩阵以便我们可以
- 绘制原始数据
所以:
# 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 散点图真可惜。)
我有一个 locfit
模型的透视图,我想向其中添加两件事
- 预测变量作为 3D 中的点space
- 根据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
(不难,虽然有点笨拙)。
您可以将它放入一个函数中,以便您可以重用它。 我们:
- 制作一个统一的 x-y 点网格
- 计算每个点的拟合值
- 使用这些绘制表面(带有色标),保存透视矩阵以便我们可以
- 绘制原始数据
所以:
# 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 散点图真可惜。)