[不清楚的问题Exponential Graph Animation P5js Canvas包含有关以编程方式标记各种范围的轴的有趣细节。我立刻想起了gnuplot所做的事情。通过交互式放大预览窗口(并且没有任何particular ticks specification),我观察到它会自动选择一个标记方案,其数量在4到10个刻度之间,固定距离是1,2或5乘以10的幂。
以下四个示例可以作为此交互过程的快照。
gnuplot> set xrange [0:1]
gnuplot> set yrange [0:exp(1)]
gnuplot> plot exp(x)
gnuplot> set xrange [0:2]
gnuplot> set yrange [0:exp(2)]
gnuplot> plot exp(x)
gnuplot> set yrange [0:exp(5)]
gnuplot> set xrange [0:5]
gnuplot> plot exp(x)
gnuplot> set yrange [0:exp(10)]
gnuplot> set xrange [0:10]
gnuplot> plot exp(x)
要实施这样的标签方案,如何找到给定范围的理想1-2-5-tick距离?(采用伪代码或JavaScript或Python等常用语言)
要从range
(0..max
)中获得这些1-2-5-tick方案之一,我们必须将数量级(exponent
)和数字(mantissa
)分开,然后找到低于或等于representative
的最高有效位的最合适的数字(1、2或5)。
请参见JavaScript中的此类功能:
// find 1-2-5-tick distance for a given range
function tick_distance(range) {
let find_factor = function(v) {
if (v >= 5) {
v = 5;
} else if (v >= 2) {
v = 2;
} else if (v >= 1) {
v = 1;
}
return v;
};
let representative = range * 0.24
let l10 = Math.log10(representative);
let exponent = Math.floor(l10);
let mantissa = l10-exponent;
let realdist = Math.pow(10, mantissa);
let factor = find_factor(realdist);
let dist = factor * Math.pow(10, exponent);
return dist;
}
0.24
的启发式因子representative
在变化的数量级中给出的滴答计数在4到10之间; 0.23
也将起作用,而0.25
仅在2*10^n
范围内最多提供10个刻度。
0.22
有时会给出11个滴答声2.26
有时给出3个滴答声我承认我自己对此因素的“确切价值”感兴趣。