在 R 中使用堆叠轴标签自动选择轴中的 "line"

Automatically choose "line" in axis with stacked axis labels in R

长话短说,我正在创建一种绘图,其中在 x 轴上,我有两个不同的变量,它们的值相互交叉(在这个最小的示例中,我有 a=1,2 和b=1:5)。我想展示另一个变量(y 轴上的变量)如何随 a 和 b 变化。我想做的是想出一种方法来自动放置第二组标签(在本例中为 "b" 变量)。这是一个最小的例子:

set.seed(1)
par(mar=c(7,3.5,1,1))
plot(1:10, 1:10+runif(10, -1, 1), xaxt="n", xlab="", ylab="", type="o")
axis(1, 1:10, rep(c("a=1", "a=2"), 5), las=2)
axis(1, seq(from=1.5, to=9.5, by=2), paste0("b=", 1:5), las=2, line=2, lwd=0)

生成以下图形:

在这种情况下,我很幸运地选择了 "line=2" 作为正确的位置。但是如果我稍微修改一下(让我的变量标签多一点"bulky"):

set.seed(1)
par(mar=c(7,3.5,1,1))
plot(1:10, 1:10+runif(10, -1, 1), xaxt="n", xlab="", ylab="", type="o")
axis(1, 1:10, rep(c("Control", "Treatment"), 5), las=2)
axis(1, seq(from=1.5, to=9.5, by=2), paste0("b=", 1:5), las=2, line=2, lwd=0)

现在标签组重叠:

有没有办法自动确定 "line" 轴的位置,这样我就可以放置第二组标签而不与第一组标签重叠?

您可以尝试以下方法。您可以使用 sprintf 为您的第二个轴调用填充空格,而不是使用 line,这可能如您所指出的那样不可靠。下面,我首先计算第一个轴调用中的最大字符数,然后乘以 2.5,这在这种情况下似乎效果很好。你可能想调整一下。然后,我使用默认值 line=1 但带有空格的 "push" 第二个轴调用远离轴线。顺便说一句,你可能想做类似 max(nchar(first axis)) + max(nchar(second axis)) 的事情来计算 padding.Finally,请注意 sprintf 中的“-”符号表示在右侧添加空格。

set.seed(1)
par(mar=c(7,3.5,1,1))

max_nchar <- max(nchar(rep(c("Control", "Treatment"), 5))) *2.5

plot(1:10, 1:10+runif(10, -1, 1), xaxt="n", xlab="", ylab="", type="o")
axis(1, 1:10, rep(c("Control", "Treatment"), 5), las=2)
axis(1, seq(from=1.5, to=9.5, by=2), 
 sprintf(paste0("%-",max_nchar,"s"), paste0("b=", 1:5)), las=2, lwd=0)