Заполните несколько разделов под кривой данных в 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

И я понял, что моя проблема в том, что на самом деле я не могу заполнить ни одну кривую, она как бы заполнена, потому что наклон там почти постоянный.


person texdditor    schedule 04.06.2014    source источник
comment
Можете ли вы опубликовать скрипт (или его минимальную версию), который вы использовали для создания этого примера? Это может быть простая модификация, чтобы получить то, что вы хотите.   -  person andyras    schedule 04.06.2014


Ответы (1)


Чтобы заполнить части ниже кривой, вы должны использовать стиль 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'
person Christoph    schedule 04.06.2014
comment
Отлично, это работает, но еще кое-что, я хочу построить свои данные с плавным сбезье, но тогда закрашенная часть не соответствует изогнутой. Например, заменив в последней части графика: '' using 1:2 smooth sbezier with lines lw 3 lt 1 title 'curve' Изображение - person texdditor; 04.06.2014
comment
Я тоже это вижу, но не знаю, почему это происходит. Если вы используете smooth csplines (для каждой строки в команде plot), то у меня это работает нормально. - person Christoph; 04.06.2014
comment
Я не могу использовать smooth csplines во второй команде plot, потому что она выдает ошибку Can't calculate splines, need at least 3 points . В любом случае csplines не аппроксимирует кривую так, как я хочу. - person texdditor; 05.06.2014
comment
Пожалуйста, смотрите мой отредактированный ответ. Лучший известный мне способ — записать сглаженные данные во временной файл, а затем использовать его с предлагаемой фильтрацией и построением графика. - person Christoph; 06.06.2014