首页 > 解决方案 > 在 Gnuplot 动画中显示更改的列值

问题描述

我正在制作卫星绕行星运行的 gnuplot 动画。我的任务是显示它的 XY 轨迹以及速度和能量与时间的相关值。我知道如何绘制路径,但我在显示速度等方面遇到了问题。

下面的代码执行以下操作:卫星轨道和时间步长——第 3:4 列;卫星位置——第 3:4 栏;行星位置——第 6:7 栏。

do for [n=0:int(STATS_records)] {

plot "sat.dat" u 3:4  every ::0::n w lp ls 2 t sprintf("steps=%i", n), \
     "sat.dat" u 3:4  every ::n::n w lp ls 4 notitle, \
     "sat.dat" u 6:7  every ::0::n w lp ls 3 notitle , \

    }

如何显示每个 sprintf 的相关速度值?速度值在第 5 列。提前谢谢大家。

卫星动画帧

标签: gnuplot

解决方案


看起来你想把所有东西都放在“key”(图例)中,但另一种选择是使用标签,可以很容易地任意放置。您可以一次放置一个标签(使用set label)并with labels使用实际标签进行绘图。不要让他们感到困惑。

您的主要问题似乎是如何从第 5 列中提取速度值。我的第一直觉(这很 hacky)是使用一些外部程序,例如awk

v = system(sprintf("awk 'NR==%d{print $5}' '%s'", n+1, infile))
set label 1 sprintf("v=%.3f", v+0) at screen 0.2,0.9

这也是标签(名为1)的示例。关键字的screen意思是屏幕相关而不是图形相关。把它放在你的for循环中会在1每次迭代时重新分配标签,所以它会覆盖上一次迭代的标签。不使用它1只会在最后一个标签上加上另一个标签,所以它会变得混乱。

使用这样的外部命令行不是很便携。(我认为它不适用于 Windows。)我看到了这个问题,它显示了如何从文件的特定行和列中提取值。我使用它时遇到的问题是stats根据设置的任何内容进行隐式过滤xrange。在制作这样的动画时,我注意到相机可能会因自动调整范围而跳动太多,因此最好严格控制绘图范围。在文件顶部定义 anxrange会干扰后续stats读取速度值的命令。

但是,您可以为stats(在文件名之前,例如stats [*:*] infile)指定一个范围。xrange但是我在将其与基于位置的预定义结合使用时遇到了问题。我发现如果我plot在行上指定所需的绘图范围而不是set xrange. 这是另一个仅使用 gnuplot 的(完整脚本)版本:

set terminal pngcairo
infile = 'anim.dat'
stats infile using 3:4 name 'data' nooutput
set key font 'Courier'

do for [n=0:data_records-1] {
  set output sprintf('frame-%03d.png', n)
  stats [*:*] infile every ::n::n using 5 name 'velocity' nooutput

  plot [data_min_x:1.1*data_max_x][data_min_y:1.1*data_max_y] \
    infile u 3:4 every ::0::n w linespoints ls 2 t \
      sprintf("steps =%6d\nvelocity =%6.3f", n, velocity_min), \
    '' u 3:4 every ::n::n w points pt 7 ps 3 notitle
}

请注意,如果需要,您可以轻松地将其更改为 a set label。另一种选择是绘制

'' u (x):(y):5 every ::n::n w labels

在图形位置 ( x , y ) 放置标签。

在此处输入图像描述

我没有你的数据,但我制作了自己的文件,希望格式与你的相似:

动画文件

0 0.0 0.0 0.0 1.11803398875 0.625
1 0.05 0.05 0.02375 1.09658560997 0.625
2 0.1 0.1 0.045 1.07703296143 0.625
3 0.15 0.15 0.06375 1.05948100502 0.625
4 0.2 0.2 0.08 1.04403065089 0.625
5 0.25 0.25 0.09375 1.0307764064 0.625
6 0.3 0.3 0.105 1.01980390272 0.625
7 0.35 0.35 0.11375 1.01118742081 0.625
8 0.4 0.4 0.12 1.00498756211 0.625
9 0.45 0.45 0.12375 1.00124921973 0.625
10 0.5 0.5 0.125 1.0 0.625
11 0.55 0.55 0.12375 1.00124921973 0.625
12 0.6 0.6 0.12 1.00498756211 0.625
13 0.65 0.65 0.11375 1.01118742081 0.625
14 0.7 0.7 0.105 1.01980390272 0.625
15 0.75 0.75 0.09375 1.0307764064 0.625
16 0.8 0.8 0.08 1.04403065089 0.625
17 0.85 0.85 0.06375 1.05948100502 0.625
18 0.9 0.9 0.045 1.07703296143 0.625
19 0.95 0.95 0.02375 1.09658560997 0.625

推荐阅读