Gnuplot плавная кривая через частотные точки + заполненная область под кривой - PullRequest
1 голос
/ 22 марта 2019

Я новичок в gnuplot и застрял в следующей ситуации.Основываясь на this У меня есть скрипт gnuplot следующим образом:

clear
reset
set key off
set border 3

set style fill solid 1.0 noborder

bin_width = 0.01;
set boxwidth bin_width absolute

bin_number(x) = floor(x/bin_width)

rounded(x) = bin_width * ( bin_number(x) + 0.5 )

plot '1000randomValuesBetween0and1.dat' using (rounded($1)):(1) smooth frequency

Это был хороший первый шаг;но я хотел бы иметь плавную кривую через точки, которые генерируются путем подсчета частоты. с заполненными кривыми не хватало того, что я хотел, двумя способами.Во-первых, это не сглаживание (я бы предпочел что-то вроде Безье, которое нельзя использовать после с );во-вторых, наполнение сделано довольно неожиданным способом, который не соответствует моим потребностям (для меня неожиданно).См. Эту картинку using 'with filledcurves'.

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

РЕДАКТИРОВАТЬ: я попытался адаптировать "нормальный" график плотности из этой демонстрации как еще один первый шаг, но мне не удалось;Я прочитал в документации, что пропускная способность должна составлять 1 / # точек, поэтому в моем случае она должна составлять 0,001, то есть я пробовал это:

set border 3 front lt black linewidth 1.000 dashtype solid
set style increment default
set style data filledcurves 
set xtics border in scale 0,0 nomirror norotate  autojustify
set xtics  norangelimit 0.00000,0.5,1.0
set title "Same data - kernel density" 
set title  font ",15" norotate

plot 'random01.dat' using 1:(1) smooth kdensity bandwidth 0.001 with filledcurves above y lt 9

, что приводит к следующему рисунку: second attempt failing with kdensity,Установка без полосы пропускания или более низкие / более высокие значения не решили проблему.График указывает , используя 1: (1) , потому что у меня просто один столбец, поэтому в соответствии с документом первое значение должно быть этим столбцом, а в качестве второго значения будет указан вес, который должен быть 1 / # баллов.в соответствии с документом.

EDIT2: установка полосы пропускания на идеальное значение или ее вообще не задание всегда дает один и тот же результат, который ничего не меняет, кроме масштаба оси y с изменением веса.

Мои данные - это 1000 значений в диапазоне от 0 до 1 (созданы случайным образом для целей тестирования).

Здесь новый график attempt with corrected bandwidth

EDIT3: уменьшение может показать другой аспект проблемы, так как график, кажется, выходит за пределы интервала заданных значений (я проверил значения, и нет примеров <0 или> 1).Вот график:

zoomed out graph

1 Ответ

0 голосов
/ 22 марта 2019

Демонстрационная программа 'violinplot.dem', включенная в дистрибутив gnuplot, а также доступная в Интернете, показывает, как делать то, что вы хотите, используя комбинацию «гладкий kdensity» и «с заполненной кривой», применяемую к незабитым данным.

Онлайн-версия здесь: демо-версия скрипки enter image description here

Примечания:

Вы неправильно прочитали документацию.1 / N - не рекомендуемая ширина полосы, это нормализованный равномерный вес.Изначально показанный вами сюжет выглядит так, будто полоса пропускания была слишком низкой.Каков диапазон значений в ваших данных?

Я предлагаю позволить программе рассчитать «идеальную» полосу пропускания для вас, а затем настроить ее, если вы считаете, что она слишком велика.Идеальное значение хранится в GPVAL_KDENSITY_BANDWIDTH.Увеличение пропускной способности сделает конверт более гладким;уменьшение его будет подчеркивать местные всплески.

...