automatizar el trazado de gnuplot con bash

11

Tengo 6 archivos que deben trazarse como gráficos de líneas con márgenes de error y enviarlos a diferentes archivos png. El formato del archivo es el siguiente.

segundos promedio-promedio min max

¿Cómo haría para trazar estos gráficos automáticamente? Entonces ejecuto un archivo llamado bash.sh y obtendrá los 6 archivos y enviará los gráficos a diferentes .pngarchivos. También se requieren títulos y etiquetas de eje.

Mintuz
fuente

Respuestas:

14

Si entiendo correctamente, esto es lo que quieres:

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

Esto supone que sus archivos están todos en el directorio actual. Lo anterior es un script bash que generará sus gráficos. Personalmente, generalmente escribo un archivo de comando gnuplot (llámelo, digamos gnuplot_in), usando un script de alguna forma, con los comandos anteriores para cada archivo y trazándolo usando gnuplot < gnuplot_in.

Para darle un ejemplo, en 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()

donde Your_file_glob_patternes algo que describe el nombre de sus archivos de datos, ya sea *o *dat. En lugar del globmódulo, también puedes usarlo os, por supuesto. Lo que sea que genere una lista de nombres de archivo, realmente.

Wojtek
fuente
1
Su comentario en su respuesta es una solución más limpia, ¿por qué no expandir la respuesta para mostrar un ejemplo? +1
bsd
Gracias por el comentario. Estaba haciendo eso mientras comentabas en la publicación.
Wojtek
0

Solución Bash, usando un archivo de comando temporal:

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
rublo
fuente
0

Esto puede ayudar.

#set terminal postfile       (These commented lines would be used to )
#set output  "d1_plot.ps"    (generate a postscript file.            )
set title "Energy vs. Time for Sample Data"
set xlabel "Time"
set ylabel "Energy"
plot "d1.dat" with lines
pause -1 "Hit any key to continue"

Ejecute el archivo de script como gnuplot filename.

Haga clic aquí para más detalles.

lala khan
fuente