GNUPLOT: лучший способ передачи данных в скрипт gnuplot - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть такой скрипт gnuplot (упрощенный)

reset session

set terminal pngcairo enhanced font "Times,25" size 800,400

filename = ifilename

stats filename nooutput

N = STATS_columns
M = STATS_records

set angles degrees
set size square 1.25,1

set output ofilename

# does some stuff
...
...
...

set parametric  

plot \ 
    for [i=2:N] filename u (posX($0, column(i))):(posY($0, column(i))) w p ps 1.2 pt 7 lc rgb lcolor(i-2)

Что я хочу сделать, это определить ifilename (входной файл) и ofilename (выходной файл) через скрипт оболочки.

Так что я подумал, что команда -e может быть просто для задания.

Так что для части скрипта gnuploat я написал это

gnuplot -e "ifilename='data/points_data1.dat'; ofilename='plot1'" chart.gp

, но этосгенерировал ошибку

"chart.gp" line 8: undefined variable: ifilename

, которая ссылается на эту строку

filename = ifilename

Я подумал, может быть, это из-за проблем с анализом двух знаков =, поэтому я удалил эту строку и переписал свою оболочкускрипт, подобный этому

gnuplot -e "filename='data/points_data1.dat'; ofilename='plot1'" chart.gp

, но на этот раз он выдал следующую ошибку

"chart.gp" line 8: undefined variable: filename

Что на самом деле сработало, это

echo "data/points_data$i.dat" | gnuplot chart.gp

, где я заменилстрока filename = ifilename с

FILE = system("read filename; echo $filename") 

и каждым экземпляром filename с FILE в .gp скрипте.

Но я не уверен, как использовать этот синтаксис дляопределите выходной файл.


Итак, мне было интересно, есть ли лучший способ ввода ввода оболочки в скрипт gnuplot?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Ваша оригинальная команда почти сработала.Вызов

gnuplot -e "ifilename='data/points_data1.dat'; ofilename='plot1'" chart.gp

правильно определил имена входных и выходных файлов.Но затем вы сожрали их в скрипте chart.gp, введя команду

  reset session

, которая очищает все определения переменных, включая те, которые вы специально хотели.Удалите эту строку из сценария, и все будет в порядке.Если цель команды «сбросить сеанс» состояла в том, чтобы убедиться, что не используется общесистемный или частный файл инициализации, то замените его на «-d» в командной строке:

  gnuplot -d -e "ifilename='data/points_data1.dat'; ofilename='plot1'" chart.gp
0 голосов
/ 02 февраля 2019
FILE = system("read filename; echo $filename") 

на самом деле в порядке.

Если вы хотите передать вывод в какой-то файл, вы можете просто пропустить set output "something.png"

и вместо этого вы можете просто отправить вывод .pngнепосредственно к stdout, запустив скрипт, подобный этому

#!/usr/bin/env gnuplot

reset session

set terminal pngcairo enhanced font "Times,25" size 800,400
...

, затем вы можете передать этот вывод в файл .png, подобный этому

./chart.gp > mypng.png

Таким образом, последняя команда будет выглядеть как-токак это

echo "data/points_data$i.dat" | gnuplot chart.gp > plot$i.png
...