在R

时间:2017-07-13 12:10:45

标签: r plot axis-labels

长话短说,我正在创建一种情节,在x轴上,我有两个不同的变量,其值彼此交叉(在这个最小的例子中,我有一个= 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)

其中产生以下图形: enter image description here

在这种情况下,我很幸运,选择“line = 2”作为正确的位置。但是,如果我稍微修改一下(并使我的变量标签更加“笨重”):

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)

现在标签组重叠:

enter image description here

有没有办法自动确定轴的“线”是什么,所以我可以放置第二组标签而不重叠第一组?

1 个答案:

答案 0 :(得分:1)

这是你可以尝试的东西。您可以使用line向第二轴调用填充空格,而不是使用sprintf,这可能是您所指出的不可靠的。下面,我首先计算第一轴调用中的最大字符数,然后乘以2.5,这在这种情况下似乎运行良好。你可能想调整一下。然后,我使用默认的line=1,但带空格将“推”第二轴调用远离轴线。顺便说一下,您可能需要执行类似max(nchar(first axis)) + max(nchar(second axis))的操作来计算填充。最后,请注意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)

enter image description here