考虑以下问题: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
)
我想过使用nchar
,plyr::round_any
,但我想不出能够处理所有情况的强大方法,包括那些具有科学格式(1.3e-4)等的情况。
答案 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