автоматизировать построение gnuplot с помощью bash

11

У меня есть 6 файлов, которые нужно построить в виде линейных графиков с полями ошибок и вывести их в разные файлы PNG. Формат файла следующий.

секунды среднее среднее мин макс

Как бы я начал строить эти графики автоматически? Поэтому я запускаю файл с именем bash.sh, и он получит 6 файлов и выведет графики в разные .pngфайлы. Названия и метки осей также обязательны.

Mintuz
источник

Ответы:

14

Если я правильно понимаю, это то, что вы хотите:

for FILE in *; do
    gnuplot <<- EOF
        set xlabel "Label"
        set ylabel "Label2"
        set title "Graph title"   
        set term png
        set output "${FILE}.png"
        plot "${FILE}" using 1:2:3:4 with errorbars
EOF
done

Это предполагает, что все ваши файлы находятся в текущем каталоге. Выше приведен скрипт bash, который будет генерировать ваши графики. Лично я обычно пишу командный файл gnuplot (назовем его, скажем, gnuplot_in), используя сценарий какой-либо формы, с указанными выше командами для каждого файла и строю его используя gnuplot < gnuplot_in.

Чтобы дать вам пример, в Python:

#!/usr/bin/env python3
import glob
commands=open("gnuplot_in", 'w')
print("""set xlabel "Label"
set ylabel "Label2"
set term png""", file=commands)

for datafile in glob.iglob("Your_file_glob_pattern"):
    # Here, you can tweak the output png file name.
    print('set output "{output}.png"'.format( output=datafile ), file=commands )
    print('plot "{file_name}" using 1:2:3:4 with errorbars title "Graph title"'.format( file_name = datafile ), file=commands)

commands.close()

где Your_file_glob_patternчто-то, что описывает именование ваших файлов данных, будь то *или *dat. Вместо globмодуля вы можете использовать osтакже, конечно. Что бы ни генерировало список имен файлов, на самом деле.

Войтек
источник
1
Ваш комментарий в вашем ответе - более чистое решение, почему бы не развернуть ответ, чтобы показать пример. +1
BSD
Спасибо за комментарий. Я просто делал это, как вы прокомментировали пост.
Войтек
0

Решение Bash с использованием временного командного файла:

echo > gnuplot.in 
for FILE in *; do
    echo "set xlabel \"Label\"" >> gnuplot.in
    echo "set ylabel \"Label2\"" >> gnuplot.in
    echo "set term png" >> gnuplot.in
    echo "set output \"${FILE}.png\" >> gnuplot.in
    echo "plot \"${FILE}\" using 1:2:3:4 with errorbars title \"Graph title\"" >> gnuplot.in
done
gnuplot gnuplot.in
рубль
источник