¿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.

Asesino
fuente
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 .

andyras
fuente
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/

DarioP
fuente
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).

Jonatan Öström
fuente
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 ;  
}
Amit Ruhela
fuente
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.

Jonatan Öström
fuente
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'
Kenorb
fuente