2016-12-11 4 views
1

Я хотел бы нарисовать линию с сюжетами, которые содержат «прыгающие» значения.Как удалить строку между «прыгающими» значениями, в gnuplot?

Вот пример: когда у нас есть графики греха (x) для нескольких циклов и постройте его, появится нереалистичная строка, которая переместится справа налево (как показано на следующем рисунке).

Одна идея избежать этого может быть использована with linespoints (link), но я хочу нарисовать его, не пересматривая исходный файл данных.

У нас есть простое и надежное решение этой проблемы?

sample image

+0

Просто поместите пустую строку в точке, где значение абсциссы в вашей скачке файла данных. – Karl

+0

@Karl Спасибо за комментарий. но, как я писал в своих вопросах, я хотел бы достичь этого, не пересматривая исходный файл. – eng27

+0

Не видел, что: «with linespoint» делает то же самое, что и «с линиями», добавляется только область точек. – Karl

ответ

2

Если предположить, что вы черчение функции, то есть для каждого й значения существует один и только одно соответствующее значение y, самый простой способ добиться того, что вы хотите, - использовать опцию smooth unique. Эта процедура сглаживания сделает данные монотонными по x, а затем построит их. Когда несколько значений y существуют для одного и того же значения x, будет использовано среднее значение.

Пример:

файл данных:

0.5 0.5 
1.0 1.5 
1.5 0.5 
0.5 0.5 

Заговор без сглаживания:

set xrange [0:2] 
set yrange [0:2] 
plot "data" w l 

enter image description here

С выравниванием:

plot "data" smooth unique 

enter image description here

+0

Это абсолютно красивое решение! Ваш метод прост/прочен и эффективен. Спасибо за замечательное решение! – eng27

1

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

Здесь может применяться «условный заговор». Предположим, у нас есть файл вроде этого:

1 2 
2 5 
3 3 
1 2 
2 5 
3 3 

т.е. существует Backline между 3-й и 4-й точке.

plot "tmp.dat" u 1:2 

enter image description here

Найти минимальное значение х:

stats "tmp.dat" u 1:2 
prev=STATS_min_x 

Или найти первое значение х:

prev=system("awk 'FNR == 1 {print $1}' tmp.dat") 

Участок линии, если текущее значение х больше, чем предыдущий, или не рассчитывать, если оно меньше:

plot "tmp.dat" u ($0==0? prev:($1>prev? $1:1/0), prev=$1):2 w l 

enter image description here

+0

Вы всегда теряете одну точку таким образом. – Karl

+0

@ Карл Да, я вижу это сейчас. –

1

ОК, это не невозможно, но следующее жуткая хак. Я действительно советую вам добавить пустую строку в ваш набор данных на перерывах.

$dat << EOD 
1 1 
2 2 
3 3 
1 5 
2 6 
3 7 
1 8 
2 9 
3 10 
EOD 

plot for [i=0:3] $dat us \ 
    ($0==0?j=0:j=j,llx=lx,lx=$1,llx>lx?j=j+1:j=j,i==j?$1:NaN):2 w lp notit 

Строит набор данных в три раза (acually четыре, есть небольшая ошибка там. Я предполагаю, что я должен инициализировать все переменные), подсчитывает, как часто значение абсциссы «скачок», и только участки точек данных, если этот счетчик j равен счетчику участка i.

Проверьте справку по серийному оператору оценки «а, б» и оператору троичного «а б: с»

 Смежные вопросы

  • Нет связанных вопросов^_^