在Gnuplot动画中显示更改列值

在Gnuplot动画中显示更改列值,gnuplot,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), \

我正在制作一个卫星环绕行星运行的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列中。提前谢谢大家


似乎您希望将所有内容都放在“键”(图例)中,但另一种选择是使用标签,标签可以轻松地任意放置。您可以一次放置一个标签(使用
设置标签
)和
使用标签
,以便使用实际标签打印。别把他们弄糊涂了

您的主要问题似乎是如何从第5列中提取速度值。我的第一个本能(相当粗糙)是使用一些外部程序,比如
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
隐式过滤。当制作这样的动画时,我注意到相机可能会在自动范围内跳得太多,因此能够严格控制绘图范围是很好的。在文件顶部定义
xrange
会干扰后续读取速度值的
stats
命令

但是,您可以为
stats
指定一个范围(在文件名之前,例如
stats[*:*]infle
)。但我在结合使用预定义的基于位置的
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
}
请注意,如果需要,您可以轻松地将其更改为
设置标签。另一种选择是绘图

'' 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

似乎您希望将所有内容都放在“键”(图例)中,但另一种选择是使用标签,标签可以轻松地任意放置。您可以一次放置一个标签(使用
设置标签
)和
使用标签
,以便使用实际标签打印。别把他们弄糊涂了

您的主要问题似乎是如何从第5列中提取速度值。我的第一个本能(相当粗糙)是使用一些外部程序,比如
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
隐式过滤。当制作这样的动画时,我注意到相机可能会在自动范围内跳得太多,因此能够严格控制绘图范围是很好的。在文件顶部定义
xrange
会干扰后续读取速度值的
stats
命令

但是,您可以为
stats
指定一个范围(在文件名之前,例如
stats[*:*]infle
)。但我在结合使用预定义的基于位置的
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
}
请注意,如果需要,您可以轻松地将其更改为
设置标签。另一种选择是绘图

'' 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

添加示例输出帧附在上面,请参见(imgur链接)。数据文件包含7列。第1列显示时间步长,第2列为时间,第3列和第4列为相应时间步长的xy坐标,第5列为相应速度,第6列和第7列为行星坐标(常量值)。行号(行)以0开头,列号以1开头。您不必对记录数进行取整,并且
范围的
的最后一个值是包含在内的。可能您需要添加示例输出帧,请参见上面的(imgur链接)。数据文件包含7列。第1列显示时间步长,第2列为时间,第3列和第4列为相应时间步长的xy坐标,第5列为相应速度,第6列和第7列为行星坐标(常量值)。行号(行)以0和开始