Я знаю, как создать гистограмму (просто используйте «с полями») в gnuplot, если мой файл .dat уже содержит правильно сформированные данные. Есть ли способ взять список чисел и сделать так, чтобы gnuplot предоставил гистограмму, основанную на диапазонах и размерах бина, которые предоставляет пользователь?
202
Ответы:
да, и это быстро и просто, хотя и очень скрыто:
проверить,
help smooth freq
почему вышеизложенное делает гистограммучтобы иметь дело с диапазонами, просто установите переменную xrange.
источник
set boxwidth binwidth
к выше. Это было действительно полезно для меня.У меня есть пара исправлений / дополнений к очень полезному ответу Born2Smile:
set boxwidth binwidth
bin
функцию:bin(x,width)=width*floor(x/width) + width/2.0
источник
bin(x,width)=width*floor(x/width) + binwidth/2.0
(вычисления с плавающей запятой)bin(x,width)=width*floor(x/width) + width/2.0
. Если мы передаемwidth
в качестве аргумента, то используйте его. :-)Будьте очень осторожны: все ответы на этой странице неявно принимают решение о том, где начинается биннинг - левый край самого левого бина, если хотите - из рук пользователя. Если пользователь комбинирует любую из этих функций для объединения данных со своим собственным решением о том, где начинается объединение (как это делается в блоге, на который есть ссылка выше), все вышеперечисленные функции неверны. С произвольной начальной точкой для биннинга «Мин» правильная функция:
Вы можете видеть, почему это правильно последовательно (это помогает нарисовать несколько ячеек и точку где-то в одном из них). Вычтите Min из вашей точки данных, чтобы увидеть, как далеко он находится в диапазоне биннинга. Затем разделите на ширину бина, чтобы вы эффективно работали в единицах «бинов». Затем «пол» результата, чтобы перейти к левому краю этой корзины, добавьте 0,5, чтобы перейти к середине корзины, умножьте на ширину, чтобы вы больше не работали в единицах корзин, а в абсолютном масштабе затем снова добавьте минимальное смещение, которое вы вычли в начале.
Рассмотрим эту функцию в действии:
Например, значение 1.1 действительно попадает в левую корзину:
Ответ Born2Smile верен только в том случае, если границы бина появляются при (n + 0,5) * ширине бина (где n пробегает целые числа). Ответ mas90 верен только в том случае, если границы бина возникают при n * binwidth.
источник
Вы хотите построить график как этот? да? Тогда вы можете взглянуть на мою статью в блоге: http://gnuplot-surprising.blogspot.com/2011/09/statistic-analysis-and-histogram.html
Ключевые строки из кода:
источник
Как обычно, Gnuplot - это фантастический инструмент для построения привлекательных графиков, который можно использовать для выполнения всевозможных вычислений. Тем не менее , он предназначен для построения графиков данных, а не в качестве калькулятора, и часто проще использовать внешнюю программу (например, Octave) для выполнения более «сложных» вычислений, сохранить эти данные в файле, а затем использовать Gnuplot для создания график. Для решения вышеуказанной проблемы, проверьте, что функция «Hist» используется Octave
[freq,bins]=hist(data)
, затем выведите ее в Gnuplot, используяисточник
Я считаю эту дискуссию чрезвычайно полезной, но у меня возникли некоторые проблемы с округлением.
Точнее говоря, используя ширину бина 0,05, я заметил, что с методами, представленными здесь выше, точки данных, которые читают 0,1 и 0,15, попадают в один и тот же бин. Это (явно нежелательное поведение), скорее всего, связано с функцией «floor».
В дальнейшем мой небольшой вклад, чтобы попытаться обойти это.
Этот рекурсивный метод для х> = 0; Можно обобщить это с помощью более условных утверждений, чтобы получить что-то еще более общее.
источник
Нам не нужно использовать рекурсивный метод, он может быть медленным. Мое решение - использовать пользовательскую функцию rint вместо встроенной функции int или floor.
Эта функция даст
rint(0.0003/0.0001)=3
, покаint(0.0003/0.0001)=floor(0.0003/0.0001)=2
.Зачем? Пожалуйста, посмотрите на функцию Perl int и заполнение нулями
источник
У меня есть небольшая модификация решения Born2Smile.
Я знаю, что это не имеет большого смысла, но вы можете захотеть это на всякий случай. Если ваши данные целочисленные, и вам нужен размер ячейки с плавающей запятой (возможно, для сравнения с другим набором данных или плотностью графика в более мелкой сетке), вам нужно будет добавить случайное число между 0 и 1 внутри пола. В противном случае возникнут пики из-за ошибки округления.
floor(x/width+0.5)
не будет делать, потому что это создаст шаблон, который не соответствует исходным данным.источник
Что касается функций биннинга, я не ожидал результата функций, предлагаемых до сих пор. А именно, если моя ширина ячейки равна 0,001, эти функции центрировали ячейки по 0,0005 точек, тогда как я чувствую, что более интуитивно понятно, что ячейки центрированы по границам 0,001.
Другими словами, я хотел бы иметь
Функция биннинга, с которой я придумал
Вот скрипт для сравнения некоторых из предлагаемых функций bin с этой:
и вот вывод
источник