簡體   English   中英

R中的“切出” 3D表面圖

[英]“Cut out” 3D Surface Plot in R

我已經使用persp()在R中創建了一個3d表面圖-盡管如果有其他方法可以更好地解決此問題,則無論如何我都不會嫁給該程序包。 我在x和y軸上的變量分別是溫度和降水量。 我已經創建了一個網格,該網格從我的最小-最大溫度和最小-最大降水量開始,並從我的函數中為z軸預測了值。

但是,實際上,我的數據並沒有真正“延伸那么遠”(即我沒有數據的尾部(例如最低降水量和最低溫度的組合)),因此外推有點誤導。

我想知道是否有一種簡單的方法可以“約束”我的情節,並且我願意接受許多類型的建議。 我可以用顏色編碼超出觀察到的天氣條件范圍的值,或者如果有一種方法可以“切出”表面,那也很棒。 例如,我找到了“界限”(例如,每個舍入溫度值的最高和最低觀測值)。 我可以將邊界用作“鋸齒曲奇切割器”,但是我還使用scatter.smooth()擬合了類似高斯的曲線,從中我可以得到一個平滑的函數來描述邊界。

如果您有任何建議,請告訴我; 我發現很難找到解決方案,但也許我只是在錯誤的地方尋找。 謝謝!

看一下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()設置中,您具有xyz 按上述步驟進行操作以定義網格(用於創建persp()圖的網格),然后使用exclude.too.far()來識別哪些網格點與數據相距太遠。 z的值設置為NA ,其中exclude.too.far()返回TRUE 然后使用persp()繪制修改后的z

如果要使用“ cookie-cutter”方法,則可以使用sp庫和point.in.polygon函數執行類似的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)

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM