2016-11-13 284 views
0

我有一個矩陣(m),我試圖繪製該矩陣的3D表示。在R中使用persp3D進行三維繪圖 - 軸問題

> dput(head(m)) 

structure(c(21930, 21844, 21758, 21672, 21586, 21500, 22016, 
21930, 21844, 21758, 21672, 21586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0), .Dim = c(6L, 26L), .Dimnames = list(
    NULL, c("freq.min", "freq.max", "X0", "X1", "X2", "X3", "X4", 
    "X5", "X6", "X7", "X8", "X9", "X10", "X11", "X12", "X13", 
    "X14", "X15", "X16", "X17", "X18", "X19", "X20", "X21", "X22", 
    "X23"))) 

我設法繪製三維表面曲線,但兩者的軸和軸標籤是不正確的。請注意,下面的三維表面圖使用整個矩陣,而不僅僅是標題,爲了簡潔起見,我只在這裏將其包含在內。

persp3D(z = m[,3:26], col = "lightgrey", shade = 0.5, ticktype = "detailed", axes=T) 

enter image description here

讓我們先從軸本身:從X0變爲X23應該是矩陣(列名)的X軸的軸,但在這裏它被視爲Y軸。 Y軸,在這裏被認爲是X軸,範圍從0到22016,間隔爲8​​6的256個區域。

我花了很長時間在互聯網上搜索關於如何更改軸標籤的答案,但沒有成功了。從我明白,如果我在persp3D(軸= F),那麼我可以自定義軸在隨後的線,像這樣關閉軸參數:

axis3d(edge= 'y+-', at =seq(0,23,by=1) , 
     labels = seq(0,23,by=1)) 

然而,RGL裝置彈出,並且僅繪製的軸沒有實際繪圖本身,而繪圖本身在內置的R圖形設備中保持不變。

如何成功更換軸?

+0

哪裏您的y值來嗎?它是否寫在矩陣中? ('freq.min'和'freq.max'大於21586)。第1行是0,第2行是86? (但'21586/86'爲251) – cuttlefish44

+0

@dww,謝謝你的建議 - 我會在未來記住這一點,以避免出現問題。 – SilvanD

+0

@墨魚魚44,我的y值對應於256行。我錯誤輸入了 - 感謝您的支持。最上一行的頻率最大值爲22016,除以86寬度的間隔,得到256 – SilvanD

回答

2

這是你在找什麼?

clab <- 0:23 
rlab <- seq(0, 21586, 86) 

cnum <- length(clab) 
rnum <- length(rlab) 

m <- matrix(
    c(runif(0.5*cnum*rnum)-1, runif(0.5*cnum*rnum)+1), 
    rnum, cnum, 
    dimnames = list(rlab, clab)) 

library(rgl) 

plot3d(
    clab, rlab, t(m), 
    type="n", 
    aspect = c(100, 200, 20), 
    xlab = "x", ylab = "y", zlab = "z", 
    sub = "Grab me and rotate me!" 
) 

surface3d(
    clab, rlab, t(m), 
    color = c("black", "white"), 
    alpha = 0.5, 
    add = TRUE 
) 

要更改可以交換x和y,並與t()轉的Z軸。作爲一個備註:我寫了兩個函數來將3D點雲數據從高位轉換爲寬位,反之亦然:recexcavAAR::spatialwiderecexcavAAR::spatiallong。我發現它們在繪圖和分析之間來回切換非常有用。也許他們對你有用。

編輯: 單呼替代解決方案persp3d

clab <- 0:23 
rlab <- seq(0, 21586, 86) 

cnum <- length(clab) 
rnum <- length(rlab) 

m <- matrix(
    c(runif(0.5*cnum*rnum)-1, runif(0.5*cnum*rnum)+1), 
    rnum, cnum, 
    dimnames = list(rlab, clab)) 

library(rgl) 

persp3d(
    clab, rlab, t(m), 
    color = c("black", "white"), 
    alpha = 0.5, 
    aspect = c(100, 200, 20), 
    xlab = "x", ylab = "y", zlab = "z", 
    sub = "Grab me and rotate me!" 
) 
+0

感謝您的幫助,但我確實希望使用persp3D函數,因爲它允許我直接打印幾張曲面圖以標準方式在圖形設備上。我該如何適應persp3d函數的這段代碼? – SilvanD

+0

或者,在另一個想法@nevrome上,您能否通過使用plot3d和surface3d函數定義par(mfrow = c(3,1)來建議一種方法來打印多個圖? – SilvanD

+0

persp3d和surface3d在此上下文中可以互換。如果用persp3d替換surface3d,我會得到相同的結果,我不確定是否可以在同一個rgl窗口中顯示不同的3D圖形,但是你一定可以一次顯示多個曲面,也許[this](https:// cran。 r-project.org/web/packages/recexcavAAR/vignettes/recexcavAAR-vignette-1.html)example help you。 – nevrome