【问题标题】:Adjust margins in persp/persp3d in R在 R 中调整 persp/persp3d 中的边距
【发布时间】:2017-05-02 14:41:25
【问题描述】:

长期阅读;第一次在这里发布海报。我发帖是因为我正在尝试使用自定义轴创建多面板 3 维图,如果不切断轴标签,我似乎无法做到这一点。

更具体地说,我正在尝试使用 persp3D() 包中的 plot3D 创建一个绘图。这是一个使用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)

而且,总而言之,标签被边缘截断。任何帮助将不胜感激。

【问题讨论】:

  • 据我所知,无论图形设备窗口的大小或尺寸,z轴(垂直轴)都会被切断。这就是我要去的那个。谢谢。

标签: r plot 3d margins


【解决方案1】:

我在寻找相同问题的答案时发现了您的问题。最后,我通过在text() 的调用中添加参数xpd = T 解决了这个问题。例如,

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

这会将标签扩展到 x 轴的整个长度,而不是切断它。

【讨论】:

    猜你喜欢
    • 2021-04-25
    • 2012-06-18
    • 2017-08-28
    • 2019-01-10
    • 2019-06-26
    • 2020-04-01
    • 2016-10-01
    • 2016-07-01
    • 1970-01-01
    相关资源
    最近更新 更多