Gnuplot итерация построения столбцов в одной строке, не отображая каждую точку - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть файл данных с 100 строками и около 400 столбцами. Я пытаюсь построить каждый набор из 2 столбцов (положение x и y для одной точки) путем итерации по столбцам, как это сделано из Выбор одной строки из файла данных в gnuplot :

table_file="/tmp/gnuplot_tab.dat"
set table table_file

line_number = 1
data_file = "data.dat"

plot for [i=2:*:2] "<(sed -n '".line_number."p' ".data_file.")" u i:i+1
unset table
plot table_file

Это прекрасно работает для line_number = 1, но, скажем, line_number = 79, он не отображает все столбцы и говорит

Ending * iteration at 0

Почему это происходит и как я могу это исправить? Конечная цель состоит в том, чтобы перебрать line_number от 1 до 100, чтобы построить точки как функцию времени, но сейчас это даже не график всех определенных линий.

Буду признателен, если вы объясните свое решение, чтобы я лучше понял gnuplot. Спасибо!

РЕДАКТИРОВАТЬ: Это на самом деле не работает и для первой строки! Я понимаю, что только половина точек строится, когда у меня есть line_number=1. Итак, проблема в том, почему это вообще не показывает все точки!

1 Ответ

1 голос
/ 30 апреля 2019

Если я вас правильно понял, ваши данные выглядят в основном так:

r1 x(1,1) y(1,1) x(1,2) y(1,2) ... x(1,200) y(1,200)
r2 x(2,1) y(2,1) x(2,2) y(2,2) ... x(2,200) y(2,200)
r3 x(3,1) y(3,1) x(3,2) y(3,2) ... x(3,200) y(3,200)
...
r100 x(100,1) y(100,1) ...     ... x(100,200) y(100,200)

и теперь вы хотите построить все пары x/y, например, как x(1,1)/y(1,1). Я не думаю, что вам нужно sed для этого. Вы можете сделать это только с помощью gnuplot. Упрощенный пример (5 строк, 7 столбцов) ниже.

Код:

### plot number pairs
reset session

$Data <<EOD
11 12 13 14 15 16 17
21 22 23 24 25 26 27
31 32 33 34 35 36 37
41 42 43 44 45 46 47
51 52 53 54 55 56 57
EOD
stats $Data
M = STATS_records  # number of datarows
N = STATS_columns  # number of columns (be aware, gnuplot only checks the first row)

plot for [j=0:M-1] for [i=2:N-1:2] $Data u i:i+1 every ::j::j with points pt 7 notitle
### end of code

Результат:

enter image description here

...