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), \
"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 列。提前谢谢大家。
解决方案
看起来你想把所有东西都放在“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
推荐阅读
- c++ - 用于内存优化的字符串编码
- ios - 如何使用 XMPP 获取登录用户的组列表?
- kubernetes - 用于移动用户代理的 Kubernetes-Ingress Server-Snippet 503
- sql-server - 处理 SQL server 数据库中的特殊字符,应该使用 varchar 还是 nvarchar?
- rest - 如何放心保留登录会话?
- javascript - angular 7 应用程序无法在 Firefox 中运行,但在 chrome 和 edge 中运行良好
- c# - 如何在 ASP.net MVC 中填充组合框选定项更改的详细信息字段
- c# - 在这种情况下如何检查链表是否有循环
- dependency-injection - requireBinding 有什么用?
- swift - 从另一个类为 Present ViewController Swift 调用特定函数