经过对现有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
我想做更多调整:
我不想保留整个情节后面的线条(即使是动画)。相反,我想要一个"子弹点" (可能是5-10像素的大小),图中每个数据点的每一帧都有文本移动。
我想在第一组框架的右下方显示一个文字(在第一个1:99循环中),另一个文字替换它,再次在右下角(在下一个1:99循环中) )。
我的代码基于此:
http://www.gnuplotting.org/animation-iv-trajectory/
但我无法弄清楚为什么他的代码有一个"跟踪"那消失了,为什么他还有一个要点,我不知道。正如我所说,我还希望文本随子弹点移动(每个数据文件的文本相同)。
答案 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
}
结果如下:
您可以使用offset
坐标将标签文字"foo"
放置在您想要的位置。
要更改点的大小,请在脚本开头的行样式命令中更改ps
的值。
我不确定两个不同文件的用途是什么(1_1910.txt和2_1920.txt),所以我在我的例子中使用了相同的文件。如果要同时绘制两个不同的东西,可能需要添加到plot命令。
至于你的其他问题,我认为仔细查看example中的代码应该会让你知道发生了什么。在示例中,范围every ::1::ii
绘制从1
到ii
的点,给出一条线;范围every ::ii::ii
仅绘制一个点。请注意,示例中的缩写w l
和w p
分别扩展为with lines
和with 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语句来解决这个问题!祝你好运