Заполните несколько разделов под кривой данных в Gnuplot.

StackOverflow https://stackoverflow.com//questions/24027903

  •  21-12-2019
  •  | 
  •  

Вопрос

У меня есть набор точек «данных», определяющих кривую, которую я хочу построить с плавной Безье.Итак, я хочу заполнить область под этой кривой между некоторыми парами значений x.Если бы у меня была только одна пара значений x, это было бы не так сложно, потому что я определяю новый набор данных и рисую его с помощью fillcu.Пример:

example of what I want to do

Проблема в том, что я хочу сделать это несколько раз в одном и том же сюжете.

Редактировать:Минимальный рабочий пример:

#!/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):

enter image description here

Если вам необходимо использовать какое-либо сглаживание, фильтр может повлиять на кривую данных по-разному, в зависимости от фильтруемой части.Вы можете сначала записать сглаженные данные во временный файл, а затем использовать их для «обычного» построения графиков:

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'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top