калибровка оси графика в переполнении стека

Я строю некоторые данные с плавающей точкой на двухмерном графике, и мне нужно откалибровать ось графика на небольшие единицы, которые выглядят аккуратно. Очевидно, что эта единица изменяется в зависимости от величины данных. Я пытаюсь найти хороший способ разделить ось на красивое число. например, если мои данные запускаются из
От -1,3345 до +5,882 можно разделить на единицы по 1,0 или 0,5. если мои данные от -100 до 800 делят оси на единицы по 100 или 50. (Надеюсь, это имеет смысл), сейчас я делю диапазон (наибольшее значение — наименьшее значение) на некоторое фиксированное целое число и получаю единицы, но это дает мне некрасиво выглядящий номер с длинными висячими цифрами. Есть ли умный способ сделать это?

2

Решение

Алгоритм ACM 463 предоставляет три простые функции для создания хороших осевых шкал с выходными значениями xminp, xmaxp и dist для минимальных и максимальных значений на шкале и расстояния между отметками на шкале с учетом запроса на n интервалы, которые включают в себя точки данных xmin а также xmax:

  1. Scale1() дает линейную шкалу с примерно n интервалы и dist целочисленная степень в 10 раз больше 1, 2 или 5.
  2. Scale2() дает линейную шкалу с точно n интервалы (промежуток между xminp и xmaxp, как правило, больше, чем разрыв, производимый Scale1()).
  3. Scale3() дает логарифмическую шкалу.

Код написан на Фортране, но его очень просто интерпретировать и преобразовывать в другие языки. Есть более сложные функции, которые дают более хорошие масштабы (например, в gnuplot), но Scale1, скорее всего, сделает эту работу за вас с минимальным кодом.

(РЕДАКТИРОВАТЬ)

Я нашел текст оригинальной статьи 1973 года онлайн Вот, который дает больше объяснения, чем код, указанный выше.

1

Другие решения

Одним из способов вычисления хорошего шага было бы найти значение самой значащей цифры длины диапазона (т.е. diff = maxVlaue - minValue), и используйте это как свой шаг. Чтобы вычислить значение самой значимой цифры, используйте следующую простую формулу:

pow(10, floor(log10(diff)))

Это берет десятичный логарифм разности, отбрасывает дробную часть, если таковые имеются, и увеличивает десятичную степень этого логарифма. Для разницы 7,2165 вычисление вернет 1; для 721.65 он вернул бы 100 и так далее.

Одним из недостатков этого расчета является то, что шаг сетки для diff 9,99 и diff 1.001 будет таким же. Одним из способов решения этой проблемы является вычисление количества линий сетки, которое вы получите для шага, и уменьшение шага в десять раз, если число строк недостаточно (скажем, менее трех).

2

По вопросам рекламы [email protected]