examples - gnuplot legend
datos de trazado de tuberías a guión gnuplot (6)
Quiero crear un gnuplot con tres gráficos en él. Los datos deben estar en línea (como quiero solo
Debe tener un aspecto como este:
Actualmente estoy usando la siguiente secuencia de comandos gnuplot para crear la trama:
set terminal png
set output "test.png"
plot for[col=2:4] "data.txt" using 1:col title columnheader(col) with lines
El archivo data.txt
es:
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
Me gustaría canalizar el data.txt en gnuplot y no confiar en el archivo de datos de referencia en el script. Algo como cat data.txt | gnuplot plot.gnu
cat data.txt | gnuplot plot.gnu
. La razón de esto es que tengo varios archivos data.txt
y no quiero crear un archivo plot.gnu
para cada uno de estos.
Leí sobre el archivo especial ''-''
en este hilo de stackoverflow y leí sobre varias gráficas en un archivo . Sin embargo, esto requeriría incluir los datos con el código gnuplot, que no está limpio.
¿Qué hay de malo en usar la opción -e de gnuplot desde el shell? Puede proporcionar una variable como entrada, por ejemplo, data.txt, desde shell utilizando:
gnuplot -e "filename=''data.txt'';ofilename=''test.png''" plot.gnu
Debería poder llamar al comando anterior varias veces con diferentes valores para "nombre de archivo" desde el shell utilizando un bucle for.
Y luego cambia su guión plot.gnu a:
set terminal png
set output ofilename
plot for[col=2:4] filename using 1:col title columnheader(col) with lines
¿Qué hay de usar el comando 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
Puedes llamarlo ahora con
echo "data.txt" | gnuplot script.gp
Mezcla ambas respuestas:
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
No es una respuesta directa, pero esto es lo que uso para mirar rápidamente los datos. Es especialmente útil con el comando de cut
cat data.txt | cut -f2 -d'' '' | gnuplot -p -e "plot ''<cat''"
Si desea trazar los datos que provienen de una tubería más de una vez, debe almacenarlos de alguna manera en la memoria. Mi forma preferida es usar un archivo temporal en /dev/shm
, que existe en la mayoría de los sistemas Linux y se asigna a la RAM. Solo para mantener las cosas limpias, puse una trampa para eliminar el archivo temporal al salir.
Ejemplo (usando tu 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")
Resultado:
12 ++------------+-------------+-------------+-------------+------------**
+ + + + + Best ****** +
| Worst***#### |
10 ++ *******Average $$$$$$++
| **** |
| *** $$$$ $$$$
8 ++ ** $$ $$ $$$$$ ++
| ** $$ $$ $$ |
| ***** $$$ $$ ####
6 ++ **** $$ ############# $$ ##### ++
| ** $$ ## # #### |
| ** $$$ ## ## |
| ** $$$$ ## |
4 ++ *********** $$$$$ #### ++
| ***** ################### |
| **** $$## |
2 ** $$$## ++
######### |
+ $$ + + + + +
0 $$------------+-------------+-------------+-------------+------------++
0 2 4 6 8 10
Si estás en un sistema Unix (es decir, no en Windows) puedes usar ''<cat''
lugar de ''-''
para leer desde stdin:
plot ''<cat'' using ...
Entonces puedes hacer cat data.txt | gnuplot script.gp
cat data.txt | gnuplot script.gp
. Sin embargo, en el caso específico que menciona en su pregunta, con el gráfico en el bucle for, lea la entrada tres veces. Por lo tanto, enviar los datos a través de la entrada estándar no es apropiado, ya que los datos desaparecerán después de la primera lectura.