Как создать фактическую гистограмму с помощью gnuplot [duplicate]

Backticks заключают литералы шаблонов, p.k.a. Шаблоны. Литералы шаблонов являются строковыми литералами, которые позволяют встроенные выражения и функции интерполяции строк.

Литералы шаблонов имеют выражения, вложенные в заполнители, обозначенные знаком доллара и фигурными скобками вокруг выражения, то есть ${expression}. Заполнитель / выражения передаются функции. Функция по умолчанию просто конкатенирует строку.

Чтобы избежать обратного хода, поставьте перед ним обратную косую черту:

`\`` === '`'; => true

Используйте обратные элементы для более легкой записи многострочной строки:

console.log(`string text line 1 
string text line 2`);

или

console.log(`Fifteen is ${a + b} and
not ${2 * a + b}.`);

vs. vanilla JS:

console.log('string text line 1\n' + 
'string text line 2');

или

console.log('Fifteen is ' + (a + b) + ' and\nnot ' + (2 * a + b) + '.');

Последовательности выхода:

  • Эскапады Unicode начинаются с \u, например \u00A9
  • Эскизы кодовой точки Unicode, обозначенные \u{}, например \u{2F804}
  • Шестнадцатеричные escape-последовательности, начатые с помощью \x, например \xA9
  • Octal буквальные escape-последовательности, начатые символами \ и (a), например \251
194
задан mary 18 March 2010 в 18:10
поделиться

9 ответов

да, и его быстрый и простой, хотя и очень скрытый:

binwidth=5
bin(x,width)=width*floor(x/width)

plot 'datafile' using (bin($1,binwidth)):(1.0) smooth freq with boxes

проверьте help smooth freq, чтобы узнать, почему приведенное выше делает гистограмму

для обработки только что установленных диапазонов переменная xrange.

219
ответ дан Matt Ball 19 August 2018 в 19:46
поделиться
  • 1
    Я думаю, что приведенный ниже ответ ChrisW дает важное замечание всем, кто хочет сделать гистограмму в Gnuplot. – Abhinav 26 October 2013 в 03:49
  • 2
    Будьте очень осторожны, это работает только в том случае, если отсутствует «отсутствует». bin в наборе ... Эта функция фиксирует y-значение отсутствующего бина для y-значения предыдущего не пропавшего мусора. Это может быть очень вводящим в заблуждение !!! – PinkFloyd 5 November 2017 в 22:06

Я нашел это обсуждение чрезвычайно полезным, но я столкнулся с некоторыми проблемами «округления».

Точнее, используя ширину бина в 0,05, я заметил, что с помощью методов, представленных здесь выше, точки данных, которые считывают 0,1 и 0,15, попадают в один и тот же лоток. Это (явно нежелательное поведение), скорее всего, связано с функцией «floor».

В дальнейшем это мой небольшой вклад, чтобы попытаться обойти это.

bin(x,width,n)=x<=n*width? width*(n-1) + 0.5*binwidth:bin(x,width,n+1)
binwidth = 0.05
set boxwidth binwidth
plot "data.dat" u (bin($1,binwidth,1)):(1.0) smooth freq with boxes

Этот рекурсивный метод для x> = 0; можно было бы обобщить это с более условными утверждениями, чтобы получить что-то еще более общее.

7
ответ дан Alex 19 August 2018 в 19:46
поделиться

У меня есть небольшая модификация решения Born2Smile.

Я знаю, что это не имеет особого смысла, но вам может понадобиться его на всякий случай. Если ваши данные целые, и вам нужен размер ячейки с плавающей запятой (возможно, для сравнения с другим набором данных или плотностью графика в более тонкой сетке), вам нужно будет добавить случайное число от 0 до 1 внутреннего этажа. В противном случае будут возникать всплески из-за ошибки округления. floor(x/width+0.5) не будет делать, потому что он создаст шаблон, который не соответствует исходным данным.

binwidth=0.3
bin(x,width)=width*floor(x/width+rand(0))
4
ответ дан Christoph 19 August 2018 в 19:46
поделиться
  • 1
    Это не имеет никакого смысла! – Christoph 2 December 2013 в 18:54
  • 2
    Вы не сталкивались с такими ситуациями, но позже можете. Вы можете протестировать его с нормально распределенными целыми числами с помощью float sd и гистограммами сюжета с bin = 1 и bin = s.d. Посмотрите, с чем вы справляетесь, и без трюка rand (0). Я поймал ошибку соавтора при просмотре его рукописи. Его результаты изменились от абсолютно глупости до красивой фигуры, как ожидалось. – path4 27 February 2014 в 07:07
  • 3
    Хорошо, возможно, объяснение настолько короткое, что его невозможно понять без более конкретного теста. Я сделаю короткое редактирование вашего ответа, чтобы я мог отменить downvote;) – Christoph 27 February 2014 в 10:14
  • 4
    Рассмотрим целые числа нормального распределения. Поскольку они являются целыми числами, многие из них будут иметь одинаковый x / width. Предположим, что число равно 1.3. С полом (x / width + 0.5) все они будут назначены в ящик 1. Но то, что 1.3 действительно означает с точки зрения плотности, состоит в том, что 70% из них должны быть в бункере 1 и 30% в бункере 2. rand (0 ) сохраняет надлежащую плотность. Таким образом, 0.5 создает всплески и rand (0) сохраняет его истинным. Уверен, что фигура hsxz будет намного более гладкой, используя rand (0) вместо 0,5. Это не просто округление, оно округляется без возмущения. – path4 28 February 2014 в 07:08

Будьте очень осторожны: все ответы на этой странице неявно принимают решение о том, где начинается битнинг - левый край самого левого лотка, если хотите, - из рук пользователя. Если пользователь объединяет любую из этих функций для объединения данных с собственным решением о том, где начинается биннинг (как это делается в блоге, который связан с выше), приведенные выше функции являются неправильными. С произвольной начальной точкой для бинания «Мин» правильная функция:

bin(x) = width*(floor((x-Min)/width)+0.5) + Min

Вы можете понять, почему это правильно последовательно (это помогает сделать несколько бункеров и точку где-то в одном из них ). Вычитайте Min из вашей точки данных, чтобы увидеть, насколько далеко находится диапазон биннинга. Затем разделите по ширине бина, чтобы эффективно работать в единицах «бункеров». Затем «поместите» результат, чтобы перейти к левому краю этого бункера, добавьте 0,5, чтобы перейти к середине бункера, умножьте его на ширину, чтобы вы больше не работали в единицах бункеров, но в абсолютном масштабе снова, затем, наконец, добавьте обратно к смещению Min, которое вы вычитаете в начале.

Рассмотрим эту функцию в действии:

Min = 0.25 # where binning starts
Max = 2.25 # where binning ends
n = 2 # the number of bins
width = (Max-Min)/n # binwidth; evaluates to 1.0
bin(x) = width*(floor((x-Min)/width)+0.5) + Min

eg значение 1.1 действительно попадает в левый бит:

  • эта функция правильно отображает его в центр левой ячейки (0.75);
  • Ответ Born2Smile, bin (x) = ширина * пол (x / ширина), неверно отображает его на 1;
  • ответ mas90, bin (x) = ширина * пол (x / width) + binwidth / 2.0, неверно отображает его до 1.5.

Ответ Born2Smile верен только в том случае, если границы бинов встречаются в (n + 0,5) * binwidth (где n пробегает целые числа). Ответ mas90 верен только в том случае, если границы бинов встречаются при n * бинарнике.

71
ответ дан ChrisW 19 August 2018 в 19:46
поделиться

Нам не нужно использовать рекурсивный метод, он может быть медленным. Мое решение использует пользовательскую функцию rint instesd функции instrinsic int или floor.

rint(x)=(x-int(x)>0.9999)?int(x)+1:int(x)

Эта функция даст rint(0.0003/0.0001)=3, а int(0.0003/0.0001)=floor(0.0003/0.0001)=2.

Почему? Посмотрите на функцию Perl int и отступы нумерации

6
ответ дан Community 19 August 2018 в 19:46
поделиться

Как обычно, Gnuplot - это фантастический инструмент для построения графиков с красивым графиком, и его можно заставить выполнять всевозможные вычисления. Тем не менее, он предназначен для построения данных, а не для использования в качестве калькулятора, и часто проще использовать внешнюю программу (например, Octave) для выполнения более сложных вычислений, сохранять эти данные в файле, а затем использовать Gnuplot для производства график. Для вышеупомянутой проблемы проверьте, что функция «hist» - Octave, используя [freq,bins]=hist(data), затем постройте это в Gnuplot, используя

set style histogram rowstacked gap 0
set style fill solid 0.5 border lt -1
plot "./data.dat" smooth freq with boxes
9
ответ дан Dai 19 August 2018 в 19:46
поделиться

Вы хотите построить график, подобный этому? enter image description here [/g1] да? Затем вы можете посмотреть мою статью в блоге: http://gnuplot-surprising.blogspot.com/2011/09/statistic-analysis-and-histogram.html

Ключевые строки из кода:

n=100 #number of intervals
max=3. #max value
min=-3. #min value
width=(max-min)/n #interval width
#function used to map a value to the intervals
hist(x,width)=width*floor(x/width)+width/2.0
set boxwidth width*0.9
set style fill solid 0.5 # fill style

#count and plot
plot "data.dat" u (hist($1,width)):(1.0) smooth freq w boxes lc rgb"green" notitle
43
ответ дан Martin Vseticka 19 August 2018 в 19:46
поделиться

У меня есть несколько поправок / дополнений к очень полезному ответу Born2Smile:

  1. Пустые ячейки заставили окно соседнего ящика неправильно распространиться в его пространство; избегайте этого, используя set boxwidth binwidth
  2. . В версии Born2Smile бины отображаются как центрированные по их нижней границе. Строго они должны простираться от нижней границы до верхней границы. Это можно исправить, изменив функцию bin: bin(x,width)=width*floor(x/width) + binwidth/2.0
83
ответ дан mgilson 19 August 2018 в 19:46
поделиться
  • 1
    Фактически эта вторая часть должна быть bin(x,width)=width*floor(x/width) + binwidth/2.0 (вычисления с плавающей запятой) – bgw 29 August 2010 в 19:33
  • 2
    Вы имеете в виду bin(x,width)=width*floor(x/width) + width/2.0. Если мы передаем width в качестве аргумента, используйте его. :-) – Mitar 16 May 2013 в 00:49
  • 3
    @mgilson Я думаю, что ответ ChrisW дает важную поправку на этот ответ. – Abhinav 26 October 2013 в 04:07

Что касается функций биннинга, я не ожидал результата предлагаемых функций. А именно, если моя ширина бина равна 0,001, эти функции центрируют бункеры на 0,0005 балла, тогда как я считаю более интуитивным, чтобы ячейки были сосредоточены на границах 0.001.

Другими словами, я хотел бы иметь

Bin 0.001 contain data from 0.0005 to 0.0014
Bin 0.002 contain data from 0.0015 to 0.0024
...

Функция binning, с которой я столкнулся, -

my_bin(x,width)     = width*(floor(x/width+0.5))

Вот скрипт для сравнения некоторых из предложенных функций bin с этим:

rint(x) = (x-int(x)>0.9999)?int(x)+1:int(x)
bin(x,width)        = width*rint(x/width) + width/2.0
binc(x,width)       = width*(int(x/width)+0.5)
mitar_bin(x,width)  = width*floor(x/width) + width/2.0
my_bin(x,width)     = width*(floor(x/width+0.5))

binwidth = 0.001

data_list = "-0.1386 -0.1383 -0.1375 -0.0015 -0.0005 0.0005 0.0015 0.1375 0.1383 0.1386"

my_line = sprintf("%7s  %7s  %7s  %7s  %7s","data","bin()","binc()","mitar()","my_bin()")
print my_line
do for [i in data_list] {
    iN = i + 0
    my_line = sprintf("%+.4f  %+.4f  %+.4f  %+.4f  %+.4f",iN,bin(iN,binwidth),binc(iN,binwidth),mitar_bin(iN,binwidth),my_bin(iN,binwidth))
    print my_line
}

, и вот результат

   data    bin()   binc()  mitar()  my_bin()
-0.1386  -0.1375  -0.1375  -0.1385  -0.1390
-0.1383  -0.1375  -0.1375  -0.1385  -0.1380
-0.1375  -0.1365  -0.1365  -0.1375  -0.1380
-0.0015  -0.0005  -0.0005  -0.0015  -0.0010
-0.0005  +0.0005  +0.0005  -0.0005  +0.0000
+0.0005  +0.0005  +0.0005  +0.0005  +0.0010
+0.0015  +0.0015  +0.0015  +0.0015  +0.0020
+0.1375  +0.1375  +0.1375  +0.1375  +0.1380
+0.1383  +0.1385  +0.1385  +0.1385  +0.1380
+0.1386  +0.1385  +0.1385  +0.1385  +0.1390
3
ответ дан Winston Smith 19 August 2018 в 19:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: