如何在gnuplot中的轨迹后创建一个动画的标记点?

时间:2014-07-22 19:57:22

标签: animation gnuplot

经过对现有GNU情节的大量调整后,我设法得到以下内容:

reset

# png
set terminal png size 350,262 enhanced font 'Verdana,10'

# color definitions
set style line 1 lc rgb '#0060ad' lt 1 lw 2 pt 7 ps 2 # --- blue

unset key
set border 0
unset tics
# set view 342,0
set xrange [-300:300]
set yrange [-300:300]

n=0
do for [ii=1:99] {
    n=n+1
    set output sprintf('png/spiral%03.0f.png',n)
    plot '1_1910.txt' every ::1::ii w l ls 1, \
   '2_1910.txt' every ::1::ii w l ls 1
}

do for [ii=1:99] {
    n=n+1
    set output sprintf('png/spiral1%03.0f.png',n)
     plot '1_1920.txt' every ::1::ii w l ls 1, \
    '2_1920.txt' every ::1::ii w l ls 1
 }

我们的想法是创建一组PNG文件,然后将它们与动画连接起来。

我使用

将它们连接在一起
  convert -delay 2 -loop 0 png/*.png animation.gif

我想做更多调整:

  1. 我不想保留整个情节后面的线条(即使是动画)。相反,我想要一个"子弹点" (可能是5-10像素的大小),图中每个数据点的每一帧都有文本移动。

  2. 我想在第一组框架的右下方显示一个文字(在第一个1:99循环中),另一个文字替换它,再次在右下角(在下一个1:99循环中) )。

  3. 我的代码基于此:

    http://www.gnuplotting.org/animation-iv-trajectory/

    但我无法弄清楚为什么他的代码有一个"跟踪"那消失了,为什么他还有一个要点,我不知道。正如我所说,我还希望文本随子弹点移动(每个数据文件的文本相同)。

2 个答案:

答案 0 :(得分:1)

我认为你可以用这样的循环来做到这一点:

n = 0
do for [ii=0:60] {
    n=n+1
    set output sprintf('png/spiral%03.0f.png',n)
    plot 'data.dat' every ::ii::ii w p ls 1, \
   'data.dat' using 1:2:("foo") every ::ii::ii w labels offset 2
}

set label 1 "hyde" at 275,-275

do for [ii=60:0:-1] {
    n=n+1
    set output sprintf('png/spiral%03.0f.png',n)
    plot 'data.dat' every ::ii::ii w p ls 1, \
   'data.dat' using 1:2:("foo") every ::ii::ii w labels offset 2
}

结果如下:

enter image description here

您可以使用offset坐标将标签文字"foo"放置在您想要的位置。

要更改点的大小,请在脚本开头的行样式命令中更改ps的值。

我不确定两个不同文件的用途是什么(1_1910.txt和2_1920.txt),所以我在我的例子中使用了相同的文件。如果要同时绘制两个不同的东西,可能需要添加到plot命令。

至于你的其他问题,我认为仔细查看example中的代码应该会让你知道发生了什么。在示例中,范围every ::1::ii绘制从1ii的点,给出一条线;范围every ::ii::ii仅绘制一个点。请注意,示例中的缩写w lw p分别扩展为with lineswith points

在该示例中,由于第二个循环的操作,该行消失,该循环以反向(for [ii=99:1:-1])运行。如果您要复制该示例,请确保您的索引运行正确的值(您可能有一个数字点以外的数字)。另请注意,gnuplot中的索引从0开始,因此如果数据文件的第一行包含数据(不是标题),则需要在ii=0而不是ii=1开始循环。

答案 1 :(得分:0)

我在这里遇到了几乎相同的问题。我找到了一个非常好的黑客!您只需在ONE循环中使用set multiplot然后unset multiplot,而不是制作多个png然后合并它们。具体我用这种方式:

do for [i=0:k] 

{    

    set multiplot 

    plot function1  
    plot function2    
    unset multiplot 

}

但不幸的是,除非您拥有的数据集已经同步,否则它不会起作用!但是可以使用if语句来解决这个问题!祝你好运