我已经使用persp()在R中创建了一个三维表面图 - 尽管如果其他东西可以更好地解决这个问题,我也不会以任何方式与该程序包结合。我在x轴和y轴上的变量分别是温度和降水。我创建了一个从我的最小 - 最大温度和最小 - 最大沉降延伸的网格,以及我的函数为z轴的预测值。
然而,实际上,我的数据并没有真正延伸到那么远的地方。 (即我不会在尾部有数据[例如最低温度和最低温度的组合])因此推断有点误导。
我想知道是否有一种简单的方式来约束"我的情节,我对许多类型的建议持开放态度。我可以对超出观察到的天气条件范围的值进行颜色编码,或者是否有一种方法可以切断"切断"表面,那也很棒。例如,我发现了"界限" (例如,每个圆形临时值的最高和最低观测到的沉降)。我可以使用边界作为"锯齿状的曲奇饼干,"但是我也使用scatter.smooth()来拟合类似高斯的曲线,我认为我可以通过这个曲线来描述边界。
如果您有任何建议,请告诉我。我找到了难以接受的解决方案,但也许我只是在寻找错误的地方。谢谢!
答案 0 :(得分:3)
查看 mgcv 包中的exclude.too.far()
函数,该函数的设计与您描述的完全相同的绘图目的相关,但与二维样条相关。
下面给出了这个函数的作用的例子,取自?exclude.too.far
library("mgcv")
x <- rnorm(100)
y <- rnorm(100) # some "data"
n <- 40 # generate a grid....
mx <- seq(min(x), max(x), length = n)
my <- seq(min(y), max(y), length = n)
gx <- rep(mx, n)
gy <- rep(my, rep(n, n))
tf <- exclude.too.far(gx, gy, x, y, 0.1)
plot(gx[!tf], gy[!tf], pch = ".")
points(x, y, col=2)
在图中,黑点是0.1距离内的网格位置(在将网格平移到单位平方之后;因此将0.1视为数据范围的约10%),这些是显示为大红点。
在persp()
设置中,您有x
,y
和z
。按上述步骤定义网格(用于创建persp()
图的网格相同),然后使用exclude.too.far()
标识哪些网格点距数据太远。将z
中的值设置为NA
,其中exclude.too.far()
返回TRUE
。然后使用z
绘制修改后的persp()
。
答案 1 :(得分:0)
如果您想采用“千篇一律”方法,可以使用sp
库和point.in.polygon
函数执行此类操作。您需要指定您感兴趣的边界点来构造多边形。
## Make some data
f <- function(theta) (1+1.5*cos(9*theta)) * (1+sin(theta)) + (1+0.5*cos(100*theta)) + (1+0.3*cos(50*theta))
x <- seq(-pi, pi, len=100)
dat <- data.frame(x=cos(x), y=sin(x)) * f(x) # points for edges of polygon
library(sp)
d <- function(a, b) { # density function to get z values
ifelse(point.in.polygon(a, b, dat$x, dat$y) > 0, 1, 0) # only points in range
}
ps <- outer(seq(min(dat$x), max(dat$x), len=100),
seq(min(dat$y), max(dat$y), len=100), d)
persp(ps, zlim=c(0, 3), theta=35, xlab="x", ylab="y", phi=25)