"剪掉" R中的3D曲面图

时间:2015-06-23 17:35:05

标签: r plot

我已经使用persp()在R中创建了一个三维表面图 - 尽管如果其他东西可以更好地解决这个问题,我也不会以任何方式与该程序包结合。我在x轴和y轴上的变量分别是温度和降水。我创建了一个从我的最小 - 最大温度和最小 - 最大沉降延伸的网格,以及我的函数为z轴的预测值。

然而,实际上,我的数据并没有真正延伸到那么远的地方。 (即我不会在尾部有数据[例如最低温度和最低温度的组合])因此推断有点误导。

我想知道是否有一种简单的方式来约束"我的情节,我对许多类型的建议持开放态度。我可以对超出观察到的天气条件范围的值进行颜色编码,或者是否有一种方法可以切断"切断"表面,那也很棒。例如,我发现了"界限" (例如,每个圆形临时值的最高和最低观测到的沉降)。我可以使用边界作为"锯齿状的曲奇饼干,"但是我也使用scatter.smooth()来拟合类似高斯的曲线,我认为我可以通过这个曲线来描述边界。

如果您有任何建议,请告诉我。我找到了难以接受的解决方案,但也许我只是在寻找错误的地方。谢谢!

2 个答案:

答案 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)

enter image description here

在图中,黑点是0.1距离内的网格位置(在将网格平移到单位平方之后;因此将0.1视为数据范围的约10%),这些是显示为大红点。

persp()设置中,您有xyz。按上述步骤定义网格(用于创建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)

enter image description here