Данные участка трубопровода в gnuplot script
Я хочу создать gnuplot с тремя графиками в нем. Данные должны быть встроенными (поскольку я хочу только
Он должен выглядеть так:
![https://s22.postimg.cc/qcc94e1i9/test.png]()
В настоящее время я использую следующий скрипт gnuplot для создания сюжета:
set terminal png
set output "test.png"
plot for[col=2:4] "data.txt" using 1:col title columnheader(col) with lines
Файл data.txt
:
Generation Best Worst Average
0 2 1 0
1 3 1 2
2 4 3 3
3 4 3 3
4 6 3 4
5 7 4 5
6 9 6 7
7 10 6 9
8 10 5 6
9 11 6 8
10 12 7 9
Я хотел бы передать data.txt в gnuplot и не полагаться на ссылочный файл данных в скрипте. Что-то вроде cat data.txt | gnuplot plot.gnu
cat data.txt | gnuplot plot.gnu
. Причина этого заключается в том, что у меня есть несколько файлов data.txt
и вы не хотите строить файл plot.gnu
для каждого из них.
Я прочитал о специальном файле '-'
qaru.site/info/205383/... и я прочитал о нескольких графиках в одном файле. Однако для этого потребуется включить данные с кодом gnuplot, который не является чистым.
Ответы
Ответ 1
Если вы используете систему Unix (т.е. не Windows), вы можете использовать '<cat'
вместо '-'
для чтения из stdin:
plot '<cat' using ...
Тогда вы можете сделать cat data.txt | gnuplot script.gp
. Однако в конкретном случае, который вы упомянули в своем вопросе, с графиком в цикле for, вы читаете ввод три раза. Поэтому отправка данных через stdin не подходит, поскольку данные будут удалены после первого считывания.
Ответ 2
не прямой ответ, но это то, что я использую для быстрого поиска данных. это особенно полезно с помощью команды cut
cat data.txt | cut -f2 -d' ' | gnuplot -p -e "plot '<cat'"
Ответ 3
Что случилось с использованием опции -e gnuplot из оболочки?
Вы можете указать переменную в качестве входных данных, например data.txt, из оболочки, используя:
gnuplot -e "filename='data.txt';ofilename='test.png'" plot.gnu
Вы должны иметь возможность вызывать указанную выше команду несколько раз с разными значениями для "filename" из оболочки, используя цикл for.
И затем вы измените свой script plot.gnu на:
set terminal png
set output ofilename
plot for[col=2:4] filename using 1:col title columnheader(col) with lines
Ответ 4
Если вы хотите печатать данные, поступающие из трубы более одного раза, вам нужно как-то их сохранить в памяти. Мой предпочтительный способ - использовать временный файл в /dev/shm
, который существует в большинстве систем Linux и карты в ОЗУ. Просто чтобы все было в порядке, я установил ловушку для удаления временного файла при выходе.
Пример (с использованием вашего data.txt):
cat data.txt | (cat > /dev/shm/mytempfile && trap 'rm /dev/shm/mytempfile' EXIT && gnuplot -e "set terminal dumb; plot for[col=2:4] '/dev/shm/mytempfile' using 1:col title columnheader(col) with lines")
Результат:
12 ++------------+-------------+-------------+-------------+------------**
+ + + + + Best ****** +
| Worst***#### |
10 ++ *******Average $$$$$$++
| **** |
| *** $$$$ $$$$
8 ++ ** $$ $$ $$$$$ ++
| ** $$ $$ $$ |
| ***** $$$ $$ ####
6 ++ **** $$ ############# $$ ##### ++
| ** $$ ## # #### |
| ** $$$ ## ## |
| ** $$$$ ## |
4 ++ *********** $$$$$ #### ++
| ***** ################### |
| **** $$## |
2 ** $$$## ++
######### |
+ $$ + + + + +
0 $$------------+-------------+-------------+-------------+------------++
0 2 4 6 8 10
Ответ 5
Как насчет использования команды system()
set terminal png
set output "test.png"
# read shell input
# the echo prints the variable, which is then piped to gnuplot
fname = system("read filename; echo $filename")
plot for[col=2:4] fname using 1:col title columnheader(col) with lines
Теперь вы можете позвонить ему с помощью
echo "data.txt" | gnuplot script.gp
Ответ 6
Смешайте оба ответа:
cat data.txt | gnuplot -e "set terminal png; set output "test.png"; plot for[col=2:4] '<cat' using 1:col title columnheader(col) with lines