обозначить координатную ось 1-2-5 галочками для данного диапазона чисел c - PullRequest
1 голос
/ 29 апреля 2020

Несколько непонятный вопрос Экспоненциальная графическая анимация P5 js Холст содержит интересную деталь о программной маркировке осей для широкого диапазона диапазонов. Я сразу вспомнил, что gnuplot делает то, что искал. Благодаря интерактивному масштабированию в окне предварительного просмотра (и без указания определенных тиков ) я заметил, что оно автоматически выбирает схему маркировки с количеством от 4 до 10 тиков и фиксированным расстоянием 1, 2 или 5-кратная мощность 10.

Следующие 4 примера могут быть взяты как снимки этого интерактивного процесса.

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 тиков для заданного диапазона?
(в псевдокоде или другом обычном языке, таком как JavaScript или Python)

1 Ответ

0 голосов
/ 29 апреля 2020

Чтобы получить одну из этих 1-2-5-тактовых схем от range (0..max), мы должны разделить порядок величины (exponent) и цифры (mantissa), и найти наиболее подходящий di git (1, 2 или 5) ниже или равен наиболее значимому di git из representative.

См. такую ​​функцию в 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;
}

Коэффициент heuristi c, равный 0.24 для representative, дает число тиков от 4 до 10 при изменении порядков величины; 0.23 также будет работать, тогда как 0.25 обеспечивает максимум 10 тиков только для диапазонов 2*10^n.

  • 0.22 дает иногда 11 тиков
  • 2.26 дает иногда 3 галочки

Я признаю, что меня самого интересует "точное значение" для этого фактора.

...