R 选择“精度”以显示其他轴打断

R 选择“精度”以显示其他轴打断,r,axis-labels,R,Axis Labels,考虑以下问题:x是一个数字向量,pretty(x)(或labeling::extended()等)提供了非常好的中断,我想手动添加一些值。现在,x可以有多种形式,比如说c(3.20003,3.20006)pretty()。比方说,我想在pi处添加一个断点,为了和其他值保持一致,我应该将其四舍五入到多少位?(在这种情况下,四舍五入(pi,6)=3.141593) 我曾想过使用nchar、plyr::round_any,但我想不出一种健壮的方法可以处理所有情况,包括那些具有科学格式(1.3e-4)的

考虑以下问题:
x
是一个数字向量,
pretty(x)
(或
labeling::extended()
等)提供了非常好的中断,我想手动添加一些值。现在,
x
可以有多种形式,比如说
c(3.20003,3.20006)
pretty()。比方说,我想在
pi
处添加一个断点,为了和其他值保持一致,我应该将其四舍五入到多少位?(在这种情况下,
四舍五入(pi,6)=3.141593

我曾想过使用nchar、plyr::round_any
,但我想不出一种健壮的方法可以处理所有情况,包括那些具有科学格式(1.3e-4)的情况等。

有趣的问题

当然,假设您的绘图函数正在使用
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

f看起来不错,谢谢。我看到问题出现在
log10()
的域之外,例如
-1.2
0.0
@baptiste——好的,我已经解决了这个问题和另一个问题,将函数简化了不少。我觉得这个现在很好。