【问题标题】:Plotting trajectory with gnuplot使用 gnuplot 绘制轨迹
【发布时间】: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


    【解决方案1】:

    当我在编码并被打断时...@Ethan 的答案已经包含所有必要的成分,但我还是发布了我的答案,并带有一些视觉演示... 检查help gifhelp statshelp 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
    

    结果:

    【讨论】:

      【解决方案2】:

      如果你只是想让动画在屏幕上显示,那么你的代码就可以了,只是你需要在连续帧之间添加一个延迟:

      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
      }
      

      【讨论】:

      • 第一部分实际上不起作用。我在一个情节而不是动画中获得所有点。
      • 您显示的命令是合法的,但可能不会产生您真正想要的结果。正如所写的那样,它应该生成从点 1 开始的图,从点 2 开始的图,依此类推。如果您想要每个图有一个点,也许您想要every ::i::i,它表示在 i 点开始并停止
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      相关资源
      最近更新 更多