Как построить кусочную функцию, используя график данных в Gnuplot?
Согласно рисунку выше. эта картинка генерируется из точек данных в текстовом файле. Мой вопрос заключается в том, как я могу удалить линию в любых двух точках, если график перескочил? (На моей картинке видно, что график скачет на х ~260)
обратите внимание, что моя цель состоит в том, чтобы я просто хотел, чтобы этот график выглядел как кусочная функция, поэтому средняя линия в середине графика не должна быть связана, потому что она перескочила.
1 ответ
В gnuplot вы можете разбить строку на несколько частей, если у вас где-то есть недопустимое значение или пустая строка.
Для первой ситуации вы можете проверить внутри using
оператор, если разница с предыдущей точкой слишком велика, и делает недействительной текущую точку. Но это также может привести к потере не только соединительной линии, но и первой точки после прыжка:
lim=3
y2=y1=0
plot 'test.dat' using (y2=y1,y1=$2,$1):($0 > 0 && abs(y2-y1) > lim ? 1/0 : y1) with linespoints
Файл тестовых данных, который я использовал
1 1
2 1.1
3 0.95
4 1
5 5
6 6
7 5.5
8 5.8
9 -2
10 -2.5
11 -4
Как видите, точки при x=5 и x=9 теряются.
Кроме того, вы можете передать ваши данные через внешний инструмент, такой как awk
для фильтрации. В этом случае вы можете вставить пустую строку, когда разница между двумя последовательными значениями y превышает некоторый предел:
filter(lim) = 'awk ''{if(NR > 1 && sqrt((y-$2)**2) > '.lim.') print ""; print; y=$2}'' test.dat'
plot '< '.filter(3) using 1:2 with lines
Обратите внимание, что я использовал sqrt((..)**2)
только для имитации abs
функция, которой нет в awk.