Заполните несколько разделов под кривой данных в Gnuplot.
Вопрос
У меня есть набор точек «данных», определяющих кривую, которую я хочу построить с плавной Безье.Итак, я хочу заполнить область под этой кривой между некоторыми парами значений x.Если бы у меня была только одна пара значений x, это было бы не так сложно, потому что я определяю новый набор данных и рисую его с помощью fillcu.Пример:
Проблема в том, что я хочу сделать это несколько раз в одном и том же сюжете.
Редактировать:Минимальный рабочий пример:
#!/usr/bin/gnuplot
set terminal wxt enhanced font 'Verdana,12'
set style fill transparent solid 0.35 noborder
plot 'data' using 1:2 smooth sbezier with lines ls 1
pause -1
Где структура «данных»:
x_point y_point
И я понял, что моя проблема в том, что на самом деле я не могу заполнить ни одну кривую, она как бы заполнена, потому что наклон там почти постоянный.
Решение
Чтобы заполнить части ниже кривой, вы должны использовать filledcurves
стиль.С опцией x1
вы заполняете часть между кривой и осью X.
Чтобы заполнить только части кривой, необходимо отфильтровать данные, т.е.присвойте значениям x значение 1/0
(неверная точка данных), если они находятся за пределами желаемого диапазона, и правильное значение из файла данных в противном случае.В конце вы строите саму кривую:
set style fill transparent solid 0.35 noborder
filter(x,min,max) = (x > min && x < max) ? x : 1/0
plot 'data' using (filter($1, -1, -0.5)):2 with filledcurves x1 lt 1 notitle,\
'' using (filter($1, 0.2, 0.8)):2 with filledcurves x1 lt 1 notitle,\
'' using 1:2 with lines lw 3 lt 1 title 'curve'
Это заполняет диапазон [-1:0.5]
и [0.2:0.8]
.
Чтобы дать рабочий пример, я использую специальное имя файла +
:
set samples 100
set xrange [-2:2]
f(x) = -x**2 + 4
set linetype 1 lc rgb '#A3001E'
set style fill transparent solid 0.35 noborder
filter(x,min,max) = (x > min && x < max) ? x : 1/0
plot '+' using (filter($1, -1, -0.5)):(f($1)) with filledcurves x1 lt 1 notitle,\
'' using (filter($1, 0.2, 0.8)):(f($1)) with filledcurves x1 lt 1 notitle,\
'' using 1:(f($1)) with lines lw 3 lt 1 title 'curve'
С результатом (с 4.6.4):
Если вам необходимо использовать какое-либо сглаживание, фильтр может повлиять на кривую данных по-разному, в зависимости от фильтруемой части.Вы можете сначала записать сглаженные данные во временный файл, а затем использовать их для «обычного» построения графиков:
set table 'data-smoothed'
plot 'data' using 1:2 smooth bezier
unset table
set style fill transparent solid 0.35 noborder
filter(x,min,max) = (x > min && x < max) ? x : 1/0
plot 'data-smoothed' using (filter($1, -1, -0.5)):2 with filledcurves x1 lt 1 notitle,\
'' using (filter($1, 0.2, 0.8)):2 with filledcurves x1 lt 1 notitle,\
'' using 1:2 with lines lw 3 lt 1 title 'curve'