我正在尝试重现这个图,即顶部有点和线的表面 .
作为参考,该图来自第160页(图4.8)Wood - GAM an introduction with R .
为了使这个例子可以重现,我使用了数据
library(data.table)
library(lattice)
library(latticeExtra)
surf <- expand.grid(x = seq(-pi, pi, length = 50),y = seq(-pi, pi, length = 50))
surf$z <-
with(surf, {
d <- 3 * sqrt(x^2 + y^2)
exp(-0.02 * d^2) * sin(d)
})
surf <- as.data.table(surf)
pts <- surf[x==2.37222302413923]
使用我使用的面板功能调整线框功能
wireframe(z ~ x * y, surf, aspect = c(1, .5),
screen = list(z=-160, x=-70),
scales = list(arrows = FALSE),
shade=TRUE,
shade.colors = function(irr, ref, height, w = 0.4){grey(w * irr + (1 - w)*(1 - (1 - ref)^0.4))},
light.source= c(0,10,10),
pts = pts,
panel.3d.wireframe =
function(x, y, z,
xlim, ylim, zlim,
xlim.scaled, ylim.scaled, zlim.scaled,
pts,
...) {
panel.3dwire(x = x, y = y, z = z,
xlim = xlim,
ylim = ylim,
zlim = zlim,
xlim.scaled = xlim.scaled,
ylim.scaled = ylim.scaled,
zlim.scaled = zlim.scaled,
...)
xx <-
xlim.scaled[1] + diff(xlim.scaled) *
(pts$x - xlim[1]) / diff(xlim)
yy <-
ylim.scaled[1] + diff(ylim.scaled) *
(pts$y - ylim[1]) / diff(ylim)
zz <-
zlim.scaled[1] + diff(zlim.scaled) *
(pts$z - zlim[1]) / diff(zlim)
panel.3dscatter(x = xx,
y = yy,
z = zz,
xlim = xlim,
ylim = ylim,
zlim = zlim,
xlim.scaled = xlim.scaled,
ylim.scaled = ylim.scaled,
zlim.scaled = zlim.scaled,
col="black",
type="l",
pch=19,
cex=1,
...)
})
要得到
我同意这不是很漂亮但它至少是一条线和一个表面的组合 . 无论如何,我不知道如何添加多行,因为在panel-argument中更改x将通过获得彼此不平行的行(R连接所有点)来产生有线结果 . 进一步如何在顶部添加积分?