2016-07-29 8 views
3

У меня есть следующий вид файла:Несколько наборов данных в одном файле данных в Gnuplot

<string1> <x1> <y1> 
<string2> <x2> <y2> 
... 

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

plot "DATAFILE" using 2:3 title column(1) 

К сожалению, этот первый выбирает первый столбец для первой строки и использует это как заголовок для всех записей.

ответ

0

Вы можете использовать awk, чтобы выбрать только те строки, где первый столбец соответствует вашим строк:

plot "<awk '$1~/string1/' DATAFILE" using 2:3 title column(1),\ 
    "<awk '$1~/string2/' DATAFILE" using 2:3 title column(1) 

и так далее. Для встроенного решения GNUPLOT, вы можете сделать:

plot "DATAFILE" u 2:(stringcolumn(1) eq "string1" ? $3:1/0),\ 
    "DATAFILE" u 2:(stringcolumn(1) eq "string2" ? $3:1/0) 

, если вы хотите сделать что-то более автоматическое, который будет генерировать графики для каждого уникального входа в колонке 1, это решение работает для меня:

входа файл (test.dat - отделенный, в противном случае необходимо изменить cut утверждение ниже):

one 1 3 
two 2 4 
ten 3 5 
ten 4 3 
two 5 4 
one 6 5 
one 7 3 
ten 8 4 
two 9 5 
ten 10 3 
two 11 4 
one 12 5 

следующая строка создает для построения графиков о Gnuplot, и сохраняет в файле:

cut -f1 test.dat | sort -u | awk ' 
BEGIN {print "plot\\"} 
{print "\"test.dat\" u 2:(stringcolumn(1) eq \""$1"\" ?\$3:1/0),\\"}' > plot.gp 

и содержание:

plot\ 
"test.dat" u 2:(stringcolumn(1) eq "one" ?$3:1/0),\ 
"test.dat" u 2:(stringcolumn(1) eq "ten" ?$3:1/0),\ 
"test.dat" u 2:(stringcolumn(1) eq "two" ?$3:1/0),\ 

тогда вы могли бы сделать:

gnuplot plot.gp 

или добавьте строку load "plot.gp" в сценарий.

Я уверен, что должно быть решение «только gnuplot», но это выходит за рамки моих знаний. Надеюсь это поможет.

+0

Возможно ли распечатать все строки, даже если я не знаю, что они на самом деле будут? – petersohn

+0

Да, конечно. Я отредактировал свой ответ с возможным решением. –

0

У вас есть только один сюжет, поэтому всего один заголовок.

Если вы хотите построить отдельно все наборы данных (разделенные два последовательных пустых строк), вы (только) нужно сказать так:

N_datasets=3 
plot for [i=0:N_datasets-1] "file.dat" using 2:3 index i with title columnhead(1) 

Но форматирование вашего файла данных не то, что Gnuplot ожидает , и использование title columnhead также пропустит первую строку (предполагается, что она содержит только заголовки). Стандартным форматом gnuplot для этого будет:

string1 
x1_1 y1_1 
x1_2 y1_2 
... 


string2 
x2_1 y2_1 
x2_2 y2_2 
... 
Смежные вопросы