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) + '.');
Последовательности выхода:
\u
, например \u00A9
\u{}
, например \u{2F804}
\x
, например \xA9
\
и (a), например \251
да, и его быстрый и простой, хотя и очень скрытый:
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.
Я нашел это обсуждение чрезвычайно полезным, но я столкнулся с некоторыми проблемами «округления».
Точнее, используя ширину бина в 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; можно было бы обобщить это с более условными утверждениями, чтобы получить что-то еще более общее.
У меня есть небольшая модификация решения Born2Smile.
Я знаю, что это не имеет особого смысла, но вам может понадобиться его на всякий случай. Если ваши данные целые, и вам нужен размер ячейки с плавающей запятой (возможно, для сравнения с другим набором данных или плотностью графика в более тонкой сетке), вам нужно будет добавить случайное число от 0 до 1 внутреннего этажа. В противном случае будут возникать всплески из-за ошибки округления. floor(x/width+0.5)
не будет делать, потому что он создаст шаблон, который не соответствует исходным данным.
binwidth=0.3
bin(x,width)=width*floor(x/width+rand(0))
Будьте очень осторожны: все ответы на этой странице неявно принимают решение о том, где начинается битнинг - левый край самого левого лотка, если хотите, - из рук пользователя. Если пользователь объединяет любую из этих функций для объединения данных с собственным решением о том, где начинается биннинг (как это делается в блоге, который связан с выше), приведенные выше функции являются неправильными. С произвольной начальной точкой для бинания «Мин» правильная функция:
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 действительно попадает в левый бит:
Ответ Born2Smile верен только в том случае, если границы бинов встречаются в (n + 0,5) * binwidth (где n пробегает целые числа). Ответ mas90 верен только в том случае, если границы бинов встречаются при n * бинарнике.
Нам не нужно использовать рекурсивный метод, он может быть медленным. Мое решение использует пользовательскую функцию 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 и отступы нумерации
Как обычно, 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
Вы хотите построить график, подобный этому? [/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
У меня есть несколько поправок / дополнений к очень полезному ответу Born2Smile:
set boxwidth binwidth
bin
: bin(x,width)=width*floor(x/width) + binwidth/2.0
bin(x,width)=width*floor(x/width) + binwidth/2.0
(вычисления с плавающей запятой)
– bgw
29 August 2010 в 19:33
bin(x,width)=width*floor(x/width) + width/2.0
. Если мы передаем width
в качестве аргумента, используйте его. :-)
– Mitar
16 May 2013 в 00:49
Что касается функций биннинга, я не ожидал результата предлагаемых функций. А именно, если моя ширина бина равна 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