我正在制作围绕行星的卫星的gnuplot动画。我的任务是显示它的XY轨迹以及速度和能量与时间的相关值。我知道如何绘制路径,但是我在显示速度等方面遇到了问题。
以下代码执行以下操作: 卫星轨道和时间步骤 - 第3列:4; 卫星位置 - 第3栏:4栏; 行星位置 - 第6列:7。
partitioners
如何显示每个sprintf的关联速度值?速度值在第5列。提前感谢大家。
答案 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 )。
我没有您的数据,但我创建了自己的文件,我希望它与您的格式类似:
<强> anim.dat 强>
'' u (x):(y):5 every ::n::n w labels