2016-12-16 103 views
1

長時間閱讀器;第一次在這裏發佈海報。我發佈是因爲我試圖用自定義軸創建多面板3維圖,而且我似乎無法切割軸標籤。在R中調整persp/persp3d的邊距

更具體地說,我試圖在plot3D包中使用persp3D()創建一個圖。這是一個使用persp()的函數。很容易設置persp(..., axes = F)關閉軸。從那裏,如persp(),我可以使用trans3d()添加行,文本等,如其他地方所示(例如,link)。添加座標軸和座標軸標籤可以很好地工作,但我無法弄清楚如何增加邊距以適應我添加到圖中的座標軸標籤。

這裏是一個重複的例子:

par(mfrow = c(1,3)) 
# fake data 
test.mat <- matrix(runif(100)*1:10, nrow = 10) 

# describe axis parameters 
x.axis <- seq(from = 0, to = 1, by = .1) 
min.x <- min(x.axis); max.x <- max(x.axis) 
y.axis <- seq(from = 0, to = 1, by = .1) 
min.y <- min(y.axis); max.y <- max(y.axis) 
z.axis <- pretty(seq(from = min(test.mat), to = max(test.mat), by = 0.1)) 
min.z <- min(z.axis); max.z <- max(z.axis) 

# 3d plot without axes 
pmatt <- persp(test.mat, box = F, theta = 35, axes = F, xaxs = "i") 

# just a little function for plotting the axes 
bbox <- function(min.x, max.x, min.y, max.y, min.z, max.z, pmat, ...){ 
    lines(trans3d(min.x, min.y, c(min.z, max.z), pmat), ...) 
    lines(trans3d(min.x, max.y, c(min.z, max.z), pmat), ...) 
    lines(trans3d(max.x, max.y, c(min.z, max.z), pmat), ...) 
    lines(trans3d(c(min.x, max.x), max.y, max.z, pmat), ...) 
    lines(trans3d(min.x, c(min.y, max.y), max.z, pmat), ...) 
} 

# print axes 
bbox(min.x, max.x, min.y, max.y, min.z, max.z, pmat = pmatt) 

# create ticks and labels, and place them with trans3d 
tick.start <- trans3d(x.axis, min.y, min.z, pmatt) 
tick.end <- trans3d(x.axis, (min.y - 0.10), min.z, pmatt) 
segments(tick.start$x, tick.start$y, tick.end$x, tick.end$y) 
label.pos <- trans3d(x.axis[], (min.y - 0.15), min.z, pmatt) 
text(label.pos$x, label.pos$y, labels = c(x.axis), adj = c(1, 0.95), srt = 0, cex = 1) 

tick.start <- trans3d(max.x, y.axis, min.z, pmatt) 
tick.end <- trans3d((max.x + 0.1), y.axis, min.z, pmatt) 
segments(tick.start$x, tick.start$y, tick.end$x, tick.end$y) 
label.pos <- trans3d((max.x + 0.15), y.axis, min.z, pmatt) 
text(label.pos$x, label.pos$y, labels = c(x.axis), adj = c(0, 0.95), srt = 0, cex = 1) 

tick.start <- trans3d(min.x, min.y, z.axis, pmatt) 
tick.end <- trans3d(min.x, (min.y - 0.1), z.axis, pmatt) 
segments(tick.start$x, tick.start$y, tick.end$x, tick.end$y) 
label.pos <- trans3d((min.x - 0.15), min.y, z.axis[-1], pmatt) 
text(label.pos$x, label.pos$y, labels = z.axis[-1], adj = c(1.5, NA), srt = 0, cex = 1) 

而且,在所有的標籤是由富餘切斷。任何幫助將不勝感激。

+0

從我所知道的情況來看,無論圖形設備窗口的大小或尺寸如何,z軸(垂直軸)都將被截斷。那是我要去的那個。謝謝。 – ChRis

回答

0

我在搜索同一問題的答案時發現了你的問題。最後,我通過將參數xpd = T添加到text()的呼叫中來解決此問題。例如,

text(label.pos$x, label.pos$y, labels = c(x.axis), adj = c(1, 0.95), srt = 0, cex = 1, xpd = T) 

這擴展了x軸的整個長度的標籤,而不是將其切斷。