给定数值范围的1-2-5个刻度的标签坐标轴

问题描述 投票:0回答:1

[不清楚的问题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)

exp(x) function in xrange 0..1

gnuplot> set xrange [0:2]
gnuplot> set yrange [0:exp(2)]
gnuplot> plot exp(x)

exp(x) function in xrange 0..2

gnuplot> set yrange [0:exp(5)]
gnuplot> set xrange [0:5]
gnuplot> plot exp(x)

exp(x) function in xrange 0..5

gnuplot> set yrange [0:exp(10)]
gnuplot> set xrange [0:10]
gnuplot> plot exp(x)

exp(x) function in xrange 0..10

要实施这样的标签方案,如何找到给定范围的理想1-2-5-tick距离?(采用伪代码或JavaScript或Python等常用语言)

algorithm plot language-agnostic axis-labels
1个回答
0
投票

要从range0..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个滴答声
  • 我承认我自己对此因素的“确切价值”感兴趣。

© www.soinside.com 2019 - 2024. All rights reserved.