在 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)
长话短说,我正在创建一种绘图,其中在 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)