Gnuplot: как построить каждую строку в файле после некоторой паузы - PullRequest
5 голосов
/ 22 октября 2008

У меня есть файл данных с 3 столбцами, и я хотел использовать splot для построения того же графика. Но я хочу, чтобы gnuplot составлял первую строку (в каком-то цвете, скажем, красном), а затем делал паузу, скажем, на 0,3 секунды, а затем перешел к построению следующей строки (другим цветом, а не красным, скажем, зеленым), сделал паузу на 0,3 секунд и затем переходит к следующему ряду .... и так далее.

Любая помощь будет с благодарностью.

заранее спасибо

С уважением, Панкадж

Ответы [ 4 ]

2 голосов
/ 08 января 2013

Чтобы получить эффект рисования каждой строки по одной (с небольшой паузой между ними), возможно, проще с текущей версией gnuplot (прошло более 4 лет с тех пор, как этот вопрос был опубликован) .

Вы можете использовать for -loop и ключевое слово every, например:

# Find out the number of lines in the data somehow, 
# for example like this:
num_lines="`cat my_datafile.d | wc -l`"

# Plot the first line in the data-file:
plot './my_datafile.d' every 1::0::0

# For the remaining lines:
do for [line_index = 1:num_lines-1] { 
  pause 0.3
  # Replot (from the same datafile) each line 
  # in the data file from the first one up to 
  # the current line_index 
  replot '' every 1::0::line_index
}

Часть every 1::0::line_index инструктирует gnuplot - в каждом цикле - рисовать каждую линию (1) в данных от первой (0) до текущего значения переменная цикла line_index. Мы используем <point_incr>, <start_point> и <end_point>, указанные в справочном тексте gnuplot:

 gnuplot> help every
 The `every` keyword allows a periodic sampling of a data set to be plotted.
 [...]

 Syntax:
    plot 'file' every {<point_incr>}
                       {:{<block_incr>}
                         {:{<start_point>}
                           {:{<start_block>}
                             {:{<end_point>}
                               {:<end_block>}}}}}
 [...]

Информация о версии:

$ gnuplot --version
gnuplot 4.6 patchlevel 0
2 голосов
/ 26 февраля 2010

Хорошая попытка, но ... Это создаст столько файлов, сколько строк в файле данных. Это выглядит уродливо для меня.

Мы можем написать скрипт shell / perl для создания скрипта gnuplot с такими командами, как:

splot x1 y1 z1
pause 1
replot x2 y2 z2
pause 1
replot x3 y3 z3
pause 1
replot x4 y4 z4

где xi, yi, zi = координаты в файле данных для номера i-й строки. пауза 1 приостановит ее на одну секунду.

Это просто идея, хотя я не уверен, как построить координаты напрямую, вместо того, чтобы передавать файл данных в gnuplot.

2 голосов
/ 22 октября 2008

Если вы хотите создать анимацию, вам лучше использовать специальные инструменты для нее (например, mplayer).

Используйте gnuplot для подготовки всех исходных изображений (сначала с одной нанесенной строкой, затем с двумя строками и т. Д.), Затем используйте mplayer или convert (из imagemagic) для создания AVI или анимированного GIF из исходных файлов.

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

file="your input file.dat"
lines=$(wc -l $file)
i=1
while [ $i -le $lines ] ; do
  head -${i} ${file} > ${file%.dat}-${i}lines.dat
done

Учитывая somefile.dat, он будет производить файлы "somefile-1lines.dat", "somefile-2lines.dat" и т. Д. Затем вы можете использовать:

for f in *lines.dat ; do
  gnuplot ... $f 
done

чтобы построить их все по порядку.

Если мое предположение неверно и все, что вам действительно нужно, это пауза, то вы можете попытаться настроить все так, чтобы gnuplot получал данные из stdin, а затем использовать этот сценарий (назовите его paused-input.sh) для передачи входной файл с паузами после каждой строки:

#!/bin/bash
while read l ; do
  echo "$l"
  sleep 1
done

Тогда вызовите это так:

(pause-input.sh | gnuplot ...) < somefile.dat
0 голосов
/ 29 марта 2010

сделать сюжетный файл напр. 'Myplotfile.plt. и вставьте в него все команды, которые вы обычно вводите в gnuplot для построения графиков.

затем просто добавьте строку

!sleep $Number_of_Seconds_to_Pause

в файл графика, где вы хотите, чтобы он приостановился, и запустите его из терминала с помощью

gnuplot myplotfile.plt

(расширение файла plot не имеет значения, если вы используете Windows или Mac Box, вы можете использовать .txt)

пример plotfile:

set title 'x squared'
plot x**2 title ''
!sleep 5
set title 'x cubed'
plot x**3 title ''
!sleep 5
...