【发布时间】:2020-08-26 03:13:37
【问题描述】:
我有一个具有以下格式的移动点位置的数据文件。
x1 y1
x2 y2
x3 y3
.
.
.
我希望在 gnuplot 中使用这些数据制作动画轨迹。我该怎么做?
我试过了
do for [i=1:20] {
plot "temp.dat" every ::i using 1 : 2 w p
}
但它将所有点绘制在单个图像中,而不是动画中。这样做的方法是什么?
【问题讨论】:
标签: gnuplot
我有一个具有以下格式的移动点位置的数据文件。
x1 y1
x2 y2
x3 y3
.
.
.
我希望在 gnuplot 中使用这些数据制作动画轨迹。我该怎么做?
我试过了
do for [i=1:20] {
plot "temp.dat" every ::i using 1 : 2 w p
}
但它将所有点绘制在单个图像中,而不是动画中。这样做的方法是什么?
【问题讨论】:
标签: gnuplot
当我在编码并被打断时...@Ethan 的答案已经包含所有必要的成分,但我还是发布了我的答案,并带有一些视觉演示...
检查help gif、help stats 和help every,这些是主要的“组件”。
在下面的示例中,您希望能找到您正在寻找的内容。
代码:
### trajectory animated
reset session
# create some test data
v = 40
a = 45
g = 9.81
set print $Data
do for [i=0:86] {
t = i/10.
sx(t) = v*cos(a)*t
sy(t) = v*sin(a)*t - 0.5*g*t**2
print sprintf("%.3f %.3f",sx(t),sy(t))
}
set print
set xrange[0:200]
set yrange[0:80]
set term gif size 400,300 animate delay 5 optimize
set output "Trajectory.gif"
stats $Data nooutput
N = STATS_records
do for [i=0:N-1] {
plot $Data u 1:2 every ::::i w l notitle, \
'' u 1:2 every ::i::i w p pt 7 lc rgb "red" notitle
}
set output
### end of code
结果:
【讨论】:
如果你只是想让动画在屏幕上显示,那么你的代码就可以了,只是你需要在连续帧之间添加一个延迟:
do for [i=1:20] {
plot "temp.dat" every ::i using 1 : 2 w p
pause 0.1 # 1/10 second between frames
}
如果您正在制作动画 gif 文件,则暂停不会进入循环本身,它会成为 set term 命令的参数:
set term gif animate delay 10 # 10 = 10 units of 0.01 seconds
set output 'animation.gif'
do for [i=1:20] {
plot "temp.dat" every ::i using 1 : 2 w p
}
【讨论】:
every ::i::i,它表示在 i 点开始并停止。