2016-05-25 24 views
2

我在使用scatter3d函數時遇到了一些問題,特別是它似乎不可能向函數指示軸的極限應該是什麼。這是我的基本的繪圖功能與設定的我的工作的幾個數據點:的如何在汽車/ RGL 3D圖上設置軸限制?特別是scatter3d

xlim = c(90,200) 
ylim = c(100,200) 
zlim = c(9,40) 

問題是

library(rgl) 
library(plot3D) 
library(car) 

df <- data.frame(meanX = c(147.34694, 173.89244, 135.73004, 121.93766, 
          109.72152, 92.53709, 165.46588, 169.77744, 
          127.01796, 99.34347), 
       meanY = c(140.40816, 110.99128, 134.56023, 164.18703, 
          166.04051, 155.97329, 105.29377, 104.42683, 
          130.17066, 155.99696), 
       avgDist = c(40.788118, 12.957329, 14.24348, 39.10424, 
          34.694258, 25.532335, 21.491695,23.528944, 
          9.309201, 31.916879)) 

car::scatter3d(x = df$meanX, y = df$meanY, z = df$avgDist, surface = FALSE) 

這繪製精細,但設置了默認的軸範圍,thatIi似乎完全無法改變這一點。我知道,RGL不允許剪裁,我不希望它在這裏排除任何數據點,但軸範圍比各軸的最高值高了不少

max(df$meanX) 
[1] 173.8924 

max(df$meanY) 
[1] 166.0405 

max(df$avgDist) 
[1] 40.78812 

我會喜歡做的事,是設置在X和Y從70到185軸限制,從我所知道的,這應該是可能與此代碼:

car::scatter3d(x = df$meanX, y = df$meanY, z = df$avgDist, surface = FALSE, 
      xlim = c(70,185), ylim = c(70,185)) 

但這只是產生同樣的情節(與沒有錯誤或警告)。任何人都知道如何手動設置這些軸?

+0

您不應該加載plot3D;它與rgl或scatter3d無關。 –

+0

rgl *確實允許剪輯。我不知道scatter3d,但plot3d會爲你做:plot3d(x = df $ meanX,y = df $ meanY,z = df $ avgDist, xlim = c(70,185),ylim = c(70,185) ) – user2554330

+0

嗯,你是,猜猜這只是與限制有問題的{汽車}包,現在我只是有問題得到我昨天剛剛工作與plot3d一起工作的surface3d函數:) –

回答

1

在axis.scales = TRUE(現在是默認值)的情況下,用於設置每個軸的最小和最大標籤和刻度的代碼由未導出的car:::nice函數選擇。您可以使用axis.scales = FALSE調用,然後重做添加軸刻度和標籤的工作。

with(df, scatter3d(meanX , meanY, avgDist, axis.scales = FALSE, 
      xlim = c(70,185), ylim = c(70,185), zlim = c(9,40))) 

或者你可以嘗試重寫代碼進行檢查,看是否有任何XLIM,ylim,或zlim參數都存在並替換那些值在車上這段代碼設置的那些:: :scatter3d:

car:::scatter3d 
#------- code near the top of the console display------ 
if (axis.scales) { 
    lab.min.x <- nice(minx) 
    lab.max.x <- nice(maxx) 
    lab.min.y <- nice(miny) 
    lab.max.y <- nice(maxy) 
    lab.min.z <- nice(minz) 
    lab.max.z <- nice(maxz) 
    minx <- min(lab.min.x, minx) 
    maxx <- max(lab.max.x, maxx) 
    miny <- min(lab.min.y, miny) 
    maxy <- max(lab.max.y, maxy) 
    minz <- min(lab.min.z, minz) 
    maxz <- max(lab.max.z, maxz) 
    min.x <- (lab.min.x - minx)/(maxx - minx) 
    max.x <- (lab.max.x - minx)/(maxx - minx) 
    min.y <- (lab.min.y - miny)/(maxy - miny) 
    max.y <- (lab.max.y - miny)/(maxy - miny) 
    min.z <- (lab.min.z - minz)/(maxz - minz) 
    max.z <- (lab.max.z - minz)/(maxz - minz) 
} 

我認爲這將是將是美好的,讓當他們在nice值的內部lim值只修改,但是這個代碼的錯誤了,所以就需要邏輯來檢測丟失限度:

lab.min.x <- max(nice(minx), xlim[1]) 
    lab.max.x <- min(nice(maxx), xlim[2]) 
    lab.min.y <- max(nice(miny), ylim[1]) 
    lab.max.y <- min(nice(maxy), ylim[2]) 
    lab.min.z <- max(nice(minz), zlim[1]) 
    lab.max.z <- min(nice(maxz), zlim[2]) 
+0

我一直在玩axis.cales = FALSE,但據我所知只能刪除蜱/刻度上的數字,但實際範圍仍然不受x/y/zlim影響 –

+0

這不是我的經驗。 –