Как построить кусочную функцию, используя график данных в 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.

Другие вопросы по тегам