Условное построение Gnuplot

Мне нужно использовать gnuplot для построения значений направления ветра (y) в зависимости от времени (x) на 2D-графике с использованием линий и точек. Это отлично работает, если последовательные значения близки друг к другу. Если значения, например, разделены на 250 градусов, тогда мне нужно иметь условие, которое проверяет предыдущее значение y и не рисует линию, соединяющую две точки. Это состояние возникает, когда направление ветра находится в секторе от 280 до 20 градусов, а графики нечеткие, например, северный ветер. Поскольку данные зависят от времени, я не могу использовать полярные диаграммы, кроме как в определенный момент времени. Мне нужно показать изменение направления с течением времени.

В основном проблема в следующем:

график y против x; when (y2-y1)> = 180, затем разрыв / стирание линии, соединяющей последовательные точки. Кто-нибудь может дать мне пример того, как это сделать?

Пример из файла данных:

2014-06-16 16:00:00 0.000 990.081 0.001 0.001 0.001 0.001 0.002 0.001 11.868 308 002.54 292 004.46 00 
2014-06-16 16:10:00 0.000 990.047 0.001 0.001 0.001 0.001 0.002 0.001 11.870 303 001.57 300 002.48 00 
2014-06-16 16:20:00 0.000 990.014 0.001 0.001 0.001 0.001 0.002 0.001 11.961 334 001.04 314 002.07 00 
2014-06-16 16:30:00 0.000 990.014 0.001 0.001 0.001 0.001 0.002 0.001 11.818 005 001.18 020 002.14 00 
2014-06-16 16:40:00 0.000 990.014 0.001 0.001 0.001 0.001 0.002 0.001 11.725 332 001.14 337 002.26 00

и я хочу построить столбец 12 против времени.


person user3778424    schedule 26.06.2014    source источник
comment
Почему бы вам не отфильтровать строки с помощью утилиты awk и не оставить только те строки, которые необходимы для ввода в gnuplot?   -  person Stauz    schedule 26.06.2014
comment
Спасибо Stauz - мне нужно сохранить все значения, данные не могут быть пропущены. Проблема только в линиях, соединяющих точки.   -  person user3778424    schedule 26.06.2014


Ответы (2)


Вы можете вставить условие фильтрации в оператор using и использовать значение 1/0, если условие не выполнено. В этом случае эта точка не связана с другими:

set timefmt '%Y-%m-%d %H:%M:%S'
set xdata time
unset key

y1 = y2 = 0
plot 'data.dat' using 1:(y1 = y2, y2 = $12, ($0 == 0 || y2 - y1 < 180) ? $12 : 1/0) with lines,\
     'data.dat' using 1:12 with points

С вашим образцом данных и версией gnuplot 4.6.5 я получаю график:

введите описание изображения здесь

К сожалению, при таком подходе нельзя категоризировать линии, но не отображаются только точки, а также линия, следующая за точкой 1/0.

Лучшим подходом было бы использовать awk для вставки пустой строки при переходе. На 2D-графике точки из разных блоков данных (разделенные одной новой линией) не связаны:

set timefmt '%Y-%m-%d %H:%M:%S'
set xdata time
unset key

plot '< awk ''{y1 = y2; y2 = $12; if (NR > 1 && y2 - y1 >= 180) printf("\n"); print}'' data.dat' using 1:12 with linespoints
person Christoph    schedule 26.06.2014
comment
Спасибо, Кристоф, когда я пробую ваше предложение, я получаю undefined variable: y2 ... - person user3778424; 26.06.2014
comment
Пример данных: 2014-06-16 00:10:00 0,000 990,147 0,001 0,001 0,001 0,001 0,002 0,001 11,479 248 004,16 257 004,81 00 2014-06-16 00:20:00 0,000 990,147 0,001 0,001 0,001 0,001 0,002 0,001 11,509 247 004,04 241 005,06 00 2014-06-16 00:30:00 0,000 990,180 0,001 0,001 0,001 0,001 0,002 0,001 11,506 258 004,86 259 006,14 00 2014-06-16 00:40:00 0,000 990.147 0,001 0,001 0,001 0,001 0,002 0,001 11,505 253003,67 256 005,16 00 2014 г. -06-16 00:50:00 0,000 990,081 0,001 0,001 0,000 0,001 0,002 0,001 11,489 243 003,64 254 004,41 00 Я строю график столбца 12 в зависимости от времени - person user3778424; 26.06.2014
comment
Вот больше данных с y (столбец 12), пересекающим 360 градусов: 2014-06-16 16:00:00 0,000 990,081 0,001 0,001 0,001 0,001 0,002 0,001 11,868 308002,54 292004,46 00 2014-06-16 16:10:00 0,000 990,047 0,001 0,001 0,001 0,001 0,002 0,001 11,870 303 001,57 300 002,48 00 2014-06-16 16:20:00 0,000 990,014 0,001 0,001 0,001 0,001 0,002 0,001 11,961 334 001,04 314 002,07 00 2014-06-16 16:30:00 0,000 990,014 0,001 0,001 0,001 0,001 0,002 0,001 11,818 005 001,18 020 002,14 00 2014-06-16 16:40:00 0,000 990,014 0,001 0,001 0,001 0,001 0,002 0,001 11,725 ​​332 001,14 337 002,26 00 - person user3778424; 26.06.2014
comment
Хорошо, смотри мою правку. Я думаю, что вариант awk должен работать лучше всего. Я включил образцы данных в ваш вопрос. Если вы делаете это самостоятельно, просто скопируйте и вставьте, отметьте данные и нажмите Ctrl + K, чтобы отформатировать их должным образом. - person Christoph; 26.06.2014
comment
Я пытаюсь использовать awk, как вы предложили - input: plot ‹awk '{y1 = y2; y2 = 12 долларов; если (NR ›1 && y2 - y1› = 180) printf (\ n); print} '/Desktop/plotdata.txt' с точками линий ...... Это дает мне сообщение об ошибке следующим образом: plot ‹awk '{y1 = y2; y2 = 12 долларов; если (NR ›1 && y2 - y1› = 180) printf (\ n); print} '/Desktop/plotdata.txt' с точками строки ^ недопустимый символ \ (в printf (\ n);) - person user3778424; 26.06.2014
comment
Скопируйте и вставьте команду построения и замените только имя файла. Вы должны заботиться о разных кавычках в разных местах. В моей команде они правы. - person Christoph; 26.06.2014
comment
В дополнение к вашему предложению - вот моя строка ввода - теперь gnuplot запрашивает спецификаторы формата .gnuplot ›plot '‹ awk' '{y1 = y2; y2 = 12 долларов; если (NR ›1 && y2 - y1› = 180) printf (\ n); print} 'с использованием 1:12' /Desktop/plotdata.txt ''% lf 'с точками строки ^ формат должен иметь 1-7 преобразований типа double (% lf) - person user3778424; 27.06.2014
comment
Пожалуйста, используйте обратные кавычки для правильного форматирования комментариев. Да, в команде отсутствовал оператор using, но вы добавили имя файла не в том месте. Заменяйте data.dat только на /Desktop/plotdata.txt: plot '< awk ''{y1 = y2; y2 = $12; if (NR > 1 && y2 - y1 >= 180) printf("\n"); print}'' /Desktop/plotdata.txt' using 1:12 with linespoints. - person Christoph; 27.06.2014
comment
Вот настройки исходного формата: они должны быть правильными. gnuplot ›формат показа Формат тика: ось x:% d /% m-% H:% M ось y:% g ось x2:% g ось y2:% g ось z: ось% g cb :% g ось r:% g gnuplot ›plot '‹ awk' '{y1 = y2; y2 = 12 долларов; если (NR ›1 && y2 - y1› = 180) printf (\ n); print} 'используя 1:12' /Desktop/plotdata.txt 'с точками линий - person user3778424; 27.06.2014
comment
Ага, почему вы отказываетесь скопировать и вставить правильную команду, которую я опубликовал в своем предыдущем комментарии? - person Christoph; 27.06.2014
comment
Приносим извинения - у меня было неправильное начальное условие - потребовалось время, чтобы его найти. Код работает - просто нужно его немного подправить. Большое спасибо за вашу помощь Кристоф - person user3778424; 27.06.2014
comment
Ок, отлично. Итак, если этот ответ вам подходит, вы можете принять ответ stackoverflow.com/help/someone-answers :) - person Christoph; 28.06.2014

Чтобы разорвать соединяющиеся строки, должны быть выполнены два условных оператора, и ОБА должны включать оператор новой строки printf ("\ n"):

сюжет '‹awk' '{y1 = y2; y2 = 12 долларов; если (NR> 1 && y2 - y1> = 180) printf ("\ n"); если (NR> 1 && y2 -y1 ‹= 0) printf (" \ n "); print} '' /Desktop/plotdata.txt 'с использованием 1:12 с точками линий

person user3778424    schedule 30.06.2014
comment
Чтобы получилось немного короче, можно использовать условие if (NR > 1 && (y2-y1 >= 180 || y2-y1 <= 0)) printf("\n") :) - person Christoph; 30.06.2014