Подтвердить что ты не робот

Gnuplot: самый короткий способ игнорировать первую строку в файле данных

У меня есть файл данных .csv, созданный другим сторонним приложением, которое должно быть построено с использованием gnuplot. Предположим, что файл имеет следующий формат:

1;2;3;4;5;6 <-- This is the header line that should be ignored (with values 1;2;...;N)
1;1;2;1;1;1
2;3;3;3;5;6
3;4;1;1;1;4

Первый столбец - это ось x, каждый из которых должен быть нанесен в виде собственного линейного графика (да, я знаю, слишком много строк в одном графике может показаться плохим, но просто для того, чтобы получить представление). Здесь MCVE:

set terminal png size 1000,500    
set datafile separator ";" # CSV file is seperated with ;
plot \
  'C://tmp/test.csv' using 1:2 with lines title "A",\
  'C://tmp/test.csv' using 1:3 with lines title "B",\
  'C://tmp/test.csv' using 1:4 with lines title "C",\
  'C://tmp/test.csv' using 1:5 with lines title "D",\
  'C://tmp/test.csv' using 1:6 with lines title "E"

Проблема заключается в том, что это также отображает первую строку, поскольку это будут данные.

Я знаю, что, чтобы игнорировать любую строку в файле данных, запустив ее с помощью #, например #1;2;3;4;5;6, но я не хочу редактировать файл, потому что он также используется другими инструментами.

Другой способ - использовать plot <filename> every ::1, чтобы игнорировать первую строку, что означало бы, что я должен был бы включить every ::1 5 раз в приведенный выше script, как объяснено в этой ссылке. Это будет выглядеть следующим образом:

set terminal png size 1000,500    
set datafile separator ";" # CSV file is seperated with ;
plot \
  'C://tmp/test.csv' every ::1 using 1:2 with lines title "A",\
  'C://tmp/test.csv' every ::1 using 1:3 with lines title "B",\
  'C://tmp/test.csv' every ::1 using 1:4 with lines title "C",\
  'C://tmp/test.csv' every ::1 using 1:5 with lines title "D",\
  'C://tmp/test.csv' every ::1 using 1:6 with lines title "E"

Является ли определение every ::1 для каждого сюжета действительно единственным способом? Есть ли более короткий - предпочтительный однострочный - способ игнорировать первую (n) линию (строки); каким-либо образом определить every ::1 "глобально" или что-то вроде (псевдокод) set datafile ignorefirstnlines 1?

4b9b3361

Ответ 1

Gnuplot может читать имена столбцов из первой строки, но вы также можете указать имена столбцов как обычно. Следовательно, это эффективно пропускает первую строку.

Выполните команду

set key autotitle columnhead

Это говорит gnuplot, что первая строка - это не данные, а имена колонок, которые будут использоваться для ключа. Вы все еще можете unset key или plot datafile title sometitle так же, как и раньше, и gnuplot просто не будет использовать эти данные.

Предположим, что мой файл выглядит как

1 2
4 5
7 8

Я могу просто выдать set key autotitle columnhead после unset key (если я действительно не хочу ключ), и он пропустит первую строку.

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


В качестве альтернативы я могу передавать свои данные через внешнюю программу. Например, используя awk (который доступен для большинства ОС, включая Windows), я могу сделать

plot "< awk '(NR>2){print;}' datafile"

чтобы пропустить первые 2 строки (используя Windows, я должен сделать '< awk "(NR>2){print;}" datafile'). Если я не хочу набирать текст, я могу сохранить это в строке

skipfile = "\"< awk '(NR>2){print;}' datafile\""

и использовать его как макрос (для Windows используйте skipfile = '"< awk \"(NR>2){print;}\" datafile"'). Например, чтобы построить файл данных с помощью строк, я мог бы сделать

plot @skipfile with lines

@skipfile просто указывает gnuplot на обработку команды, как будто я только что набрал содержимое skipfile.