¿Estructura de bucle dentro de gnuplot?


82

¿Hay alguna forma de recuperar datos de forma iterativa de varios archivos y trazarlos en el mismo gráfico en gnuplot? Supongamos que tengo archivos como data1.txt, data2.txt ...... data1000.txt; cada uno con el mismo número de columnas. Ahora podría escribir algo como

plot "data1.txt" using 1:2 title "Flow 1", \
     "data2.txt" using 1:2 title "Flow 2", \
      .
      .
      .
     "data1000.txt"  using 1:2 title "Flow 6"

Pero esto sería realmente un inconveniente. Me preguntaba si hay una manera de recorrer la parte de la trama en gnuplot.


bashFunción realmente acogedora en la respuesta a continuación
Hastur

Respuestas:


96

Seguro que hay (en gnuplot 4.4+):

plot for [i=1:1000] 'data'.i.'.txt' using 1:2 title 'Flow '.i

La variable ise puede interpretar como una variable o una cadena, por lo que podría hacer algo como

plot for [i=1:1000] 'data'.i.'.txt' using 1:($2+i) title 'Flow '.i

si desea tener líneas desplazadas entre sí.

Escriba help iterationen la línea de comando de gnuplot para obtener más información.

También asegúrese de ver la respuesta de @ DarioP sobre la do forsintaxis; que te da algo más parecido a un forbucle tradicional .


Gracias, su solución "plot for [i = 1: 1000] 'data'.i.'. Txt 'usando el título 1: 2' Flow '.i" funcionó para mí .. Estoy usando gnuplot 5.2 con C ++ en Windows .. ..
MasoodUrRehman

Pero tengo otro problema, estoy escribiendo un programa que escribe K número de archivos en el disco duro a través de fream K es una variable global, así que quiero trazar K número de archivos en mi gráfico usando gnuplot que probé [i = 1 : K] pero da error de variable indefinida. Probé afuera para bucle de gnuplot pero eso tampoco funciona.
MasoodUrRehman

Escribí una función en C ++ para gnuplot que funciona con para [i = 1: 5] pero cuando uso para para [i = 1: K] da error ...
MasoodUrRehman

@MasoodUrRehman parece que podría estar intentando utilizar una variable de su código C ++ en su script gnuplot; asegúrese de imprimir el valor de la variable K cuando envíe comandos a gnuplot. Gnuplot dice 'variable indefinida' porque C ++ sabe qué es K pero gnuplot no. Si todavía está atascado, podría ser bueno publicar su problema como una pregunta de C ++ separada.
andyras

83

Eche un vistazo también al do { ... }comando desde gnuplot 4.6 ya que es muy poderoso:

do for [t=0:50] {
  outfile = sprintf('animation/bessel%03.0f.png',t)
  set output outfile
  splot u*sin(v),u*cos(v),bessel(u,t/50.0) w pm3d ls 1
}

http://www.gnuplotting.org/gnuplot-4-6-do/


1
¿Puedo usar también el iterador t para referirme a un índice en una matriz de, por ejemplo, nombres de archivos o colores?
tommy.carstensen

1
Nunca lo he intentado, pero no veo ningún problema con eso. Finalmente, la otra posibilidad es especificar los elementos de la matriz (colores, nombres o lo que sea) directamente en los corchetes, como se muestra en help do.
DarioP

1
Hice una nueva pregunta aquí stackoverflow.com/questions/18591986/loop-over-array-in-gnuplot , porque no es obvio para mí cómo se puede lograr.
tommy.carstensen

10

Tengo el script all.p

set ...
...
list=system('ls -1B *.dat')
plot for [file in list] file w l u 1:2 t file

Aquí las dos últimas filas son literales, no heurísticas. Entonces corro

$ gnuplot -p all.p

Cambie *.datal tipo de archivo que tiene o agregue tipos de archivo.

Siguiente paso: agregue a ~ / .bashrc esta línea

alias p='gnuplot -p ~/./all.p'

y ponga su archivo en all.psu directorio personal y listo. Puede trazar todos los archivos en cualquier directorio escribiendo py enter.

EDITAR Cambié el comando, porque no funcionó. Anteriormente contenía list(i)=word(system(ls -1B *.dat),i).


Para mí tu código no funciona. En su lugar, tuve que escribir list=system(ls -1B *.dat).
Jaxan

HM esta bien. Estaba en la versión 4.6 en Linux.
Jonatan Öström

1
Así que lo intenté de nuevo y, como dices, no funciona. Tuve que usar comillas simples dentro de la llamada al sistema para que tu comando funcionara:list=system('ls -1B *.dat')
Jonatan Öström

no me funciona. con o sin comillas. ¿por qué?
samira

@samira, no lo sé.
Jonatan Öström

4

Utilice lo siguiente si tiene columnas discretas para trazar en un gráfico

do for [indx in "2 3 7 8"] {
  column = indx + 0
  plot ifile using 1:column ;  
}

Aquí se proporciona un único ejemplo que muestra cómo recorrer números no consecutivos.
rehctawrats

2

Quería usar comodines para trazar múltiples archivos a menudo ubicados en diferentes directorios, mientras trabajaba desde cualquier directorio. La solución que encontré fue crear la siguiente función en~/.bashrc

plo () {
local arg="w l"
local str="set term wxt size 900,500 title 'wild plotting'
set format y '%g'
set logs
plot"
while [ $# -gt 0 ]
        do str="$str '$1' $arg,"
        shift
done
echo "$str" | gnuplot -persist
}

y utilícelo, por ejemplo plo *.dat ../../dir2/*.out, como , para trazar todos los .datarchivos en el directorio actual y todos los .outarchivos en un directorio que pasa a ser un nivel superior y es llamado dir2.


Puede agregar plo() { [[ $# -eq 0 ]] && echo "Usage plo file1 file2 ..." || { .... } }para evitar llamar gnuplotsin archivos.
Hastur

0

Aquí está el comando alternativo:

gnuplot -p -e 'plot for [file in system("find . -name \\*.txt -depth 1")] file using 1:2 title file with lines'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.