Я строю некоторые данные с плавающей точкой на двухмерном графике, и мне нужно откалибровать ось графика на небольшие единицы, которые выглядят аккуратно. Очевидно, что эта единица изменяется в зависимости от величины данных. Я пытаюсь найти хороший способ разделить ось на красивое число. например, если мои данные запускаются из
От -1,3345 до +5,882 можно разделить на единицы по 1,0 или 0,5. если мои данные от -100 до 800 делят оси на единицы по 100 или 50. (Надеюсь, это имеет смысл), сейчас я делю диапазон (наибольшее значение — наименьшее значение) на некоторое фиксированное целое число и получаю единицы, но это дает мне некрасиво выглядящий номер с длинными висячими цифрами. Есть ли умный способ сделать это?
Алгоритм ACM 463 предоставляет три простые функции для создания хороших осевых шкал с выходными значениями xminp, xmaxp и dist для минимальных и максимальных значений на шкале и расстояния между отметками на шкале с учетом запроса на n
интервалы, которые включают в себя точки данных xmin
а также xmax
:
Scale1()
дает линейную шкалу с примерно n
интервалы и dist
целочисленная степень в 10 раз больше 1, 2 или 5.Scale2()
дает линейную шкалу с точно n
интервалы (промежуток между xminp и xmaxp, как правило, больше, чем разрыв, производимый Scale1()
).Scale3()
дает логарифмическую шкалу.Код написан на Фортране, но его очень просто интерпретировать и преобразовывать в другие языки. Есть более сложные функции, которые дают более хорошие масштабы (например, в gnuplot
), но Scale1, скорее всего, сделает эту работу за вас с минимальным кодом.
(РЕДАКТИРОВАТЬ)
Я нашел текст оригинальной статьи 1973 года онлайн Вот, который дает больше объяснения, чем код, указанный выше.
Одним из способов вычисления хорошего шага было бы найти значение самой значащей цифры длины диапазона (т.е. diff = maxVlaue - minValue
), и используйте это как свой шаг. Чтобы вычислить значение самой значимой цифры, используйте следующую простую формулу:
pow(10, floor(log10(diff)))
Это берет десятичный логарифм разности, отбрасывает дробную часть, если таковые имеются, и увеличивает десятичную степень этого логарифма. Для разницы 7,2165 вычисление вернет 1; для 721.65 он вернул бы 100 и так далее.
Одним из недостатков этого расчета является то, что шаг сетки для diff
9,99 и diff
1.001 будет таким же. Одним из способов решения этой проблемы является вычисление количества линий сетки, которое вы получите для шага, и уменьшение шага в десять раз, если число строк недостаточно (скажем, менее трех).