显示更改Gnuplot动画中的列值

时间:2018-05-05 13:58:12

标签: gnuplot

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

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

partitioners

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

satellite animation frame

1 个答案:

答案 0 :(得分:1)

似乎您想将所有内容放在“键”(图例)中,但另一种选择是使用标签,可以轻松放置任意。您可以一次放置一个标签(使用namespace neveruse{ int abs(int); } using namespace neveruse; )和set label,以便使用实际标签进行绘图。不要让他们困惑。

你的主要问题似乎是如何从第5列中提取速度值。我的第一直觉(非常hacky)是使用一些外部程序,如with labels

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只会在最后一个标签上面贴上另一个标签,所以它会变得混乱。

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

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

set xrange

请注意,如果需要,您可以轻松将其更改为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 } 。另一种选择是绘制

set label

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

enter image description here

我没有您的数据,但我创建了自己的文件,我希望它与您的格式类似:

<强> anim.dat

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