选择精度以显示其他轴断点

时间:2014-04-19 12:14:46

标签: r axis-labels

考虑以下问题:x是一个数字向量,pretty(x)(或labeling::extended()等)提供了非常好的中断,我想手动添加一些值。现在,x可以采用多种形式,例如c(3.20003, 3.20006)pretty()非常聪明地为间隔3.200030 3.200035 3.200040 3.200045 3.200050 3.200055 3.200060找到好的休息时间。比如说,我想在pi添加一个中断,我应该将它绕到多少位数,以便与其他值保持一致? (在这种情况下,round(pi, 6) = 3.141593

我想过使用ncharplyr::round_any,但我想不出能够处理所有情况的强大方法,包括那些具有科学格式(1.3e-4)等的情况。

1 个答案:

答案 0 :(得分:1)

有趣的问题。

当然假设您的绘图功能正在使用pretty()(或类似行为的东西)来确定轴断点,这应该提供一个通用的解决方案:

f <- function(x, range) {
    rcol <- floor(log10(abs(diff(pretty(range)[1:2]))))
    round(x, -rcol)
}

## Test it out
options(digits=15)
x <- c(3.20003, 3.20006)

f(pi, x)
# 3.141593

f(pi*1e3, x)
# [1] 3141.592654

f(pi*1e-3, x)
# [1] 0.003142

f(pi*1e10, x*1e10)
# [1] 31415930000

f(pi*1e20, x*1e20)
# [1] 3.141593e+20

f(pi, c(0,5))
# [1] 3

f(pi, c(0,10))
# [1] 3

f(c(pi, -pi), c(-1.2,0.0))
# [1]  3.1 -3.1

f(pi*1e-7, x)
# [1] 0

f(pi*2e-7, x)
# [1] 1e-06