2016-03-03 5 views
2

Примечание: Я могу управлять форматом файла данных, но он должен быть одним файлом.Множество наборов данных из одного файла

Я пытаюсь построить несколько наборов данных на одном графике с использованием gnuplot. Я хотел бы в идеале построить что-то вроде этого:

data_1 0 0 
data_2 0 0 
data_1 1 1 
data_2 0 1 
data_1 2 2 
data_2 1 2 

И так далее. В этом случае data_1 и data_2 должны быть двумя отдельными кривыми.

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

Как альтернатива для последнего курорта, я мог бы разбить исходный файл на один файл на один набор данных с помощью grep и начертить их (я думаю, это проще?), Но я ищу способ сделать это с помощью одного файл.

ответ

3

Gnuplot-путь для сохранения данных будет разделять наборы данных с две пустых строк.Затем вы можете использовать index для доступа к различным наборам данных в одном файле:

data_1 0 0 
data_1 1 1 
data_1 2 2 


data_2 0 0 
data_2 0 1 
data_2 1 2 

И сюжет, что с

plot 'file.dat' using 2:3 index 0, '' using 2:3 index 1 

Чтобы получить количество наборов данных, используйте stats команду, которая сохраняет номер наборов данных (блоков данных) в переменной, которые можно использовать для итерации:

stats 'file.dat' using 0 nooutput 
plot for [i=0:(STATS_blocks - 1)] 'file.dat' using 2:3 index i 

Чтобы продлить это, вы могли бы даже формат файла следующим образом

data_1 
0 0 
1 1 
2 2 


data_2 
0 0 
0 1 
1 2 

и использовать первую строку данных Seach набор в качестве ключевых участков:

set key autotitle columnheader 
stats 'file.dat' using 0 nooutput 
plot for [i=0:(STATS_blocks - 1)] 'file.dat' using 1:2 index i 

enter image description here

+0

Это, безусловно, путь, если OP может реструктурировать файл (и они говорят, они могут это делать бесплатно). Я хотел ответить на него, используя предоставленную файловую структуру. Это, однако, самый простой способ, когда такая реструктуризация возможна. – Matthew

1

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

Например, с помощью python3 (и кавычек в стиле Windows), мы можем сделать

values = system('python -c "data = sorted(set(x.split()[0] for x in open(\"datafile\",\"r\"))); print(\"\n\".join(data))"') 

Это приведет к переменному значению содержит "data_1 data_2". Теперь мы можем использовать цикл plot for. Мы проверяем каждую строку, чтобы проверить правильность первого значения столбца. Если это не мы используем значение 1/0, которое заставляет gnuplot пропускать эту строку.

plot for [w in values] datafile u 2:((strcol(1) eq w)?$3:1/0) with points pt 7 t w 

enter image description here

Конечно, это вызывает разрывы в графиках. Если мы не хотим этого (например, используя стиль линий), мы можем использовать внешнюю программу для фильтрации. Например, используя AWK (с Windows, котировки)

plot for [w in values] sprintf('< awk "($1==\"%s\")" datafile',w) u 2:3 with lines t w 

enter image description here

Здесь мы используем sprintf для создания перенаправления команд с использованием AWK для индекса мы работаем с:

< awk "($1==\"data_1\")" datafile 
< awk "($1==\"data_2\")" datafile 


Используя стандартные команды unix, мы также можем сделать (котировки Windows)

values = system('awk "{print $1}" datafile | sort | uniq') 
Смежные вопросы