在 Gnuplot 中从单个文件创建 gif

问题描述 投票:0回答:2

我有一个如下所示的长文件(我只是写一个示例)

0.0 0.00209627946771 6483.0 3092622.0 1100
0.1 0.00253798848144 78.0 30733.0 1100
0.2 0.0174927113703 6.0 343.0 1100
0.3 0.0 0.0 35.0 1100
0.4 0.1 1.0 10.0 1100
0.5 0.0 0.0 4.0 1100
0.9 0.0 0.0 1.0 1100
1.0 0.0 0.0 2.0 1100
0.0 0.00292927058349 9057.0 3091896.0 2100
0.1 0.00299136583044 88.0 29418.0 2100
0.2 0.00743889479277 14.0 1882.0 2100
0.3 0.00578034682081 2.0 346.0 2100
0.4 0.0172413793103 2.0 116.0 2100
0.5 0.030303030303 1.0 33.0 2100
0.6 0.0 0.0 11.0 2100
0.7 0.0 0.0 10.0 2100
0.8 0.0 0.0 11.0 2100
0.9 0.181818181818 2.0 11.0 2100
1.0 0.0 0.0 16.0 2100
0.0 0.00318549549582 9845.0 3090571.0 3100
0.1 0.00273270708796 80.0 29275.0 3100
0.2 0.00489168413697 14.0 2862.0 3100
0.3 0.00810372771475 5.0 617.0 3100
0.4 0.010101010101 2.0 198.0 3100

我感兴趣绘制的数据是第一列和第二列。第5列是我模拟的时间(这是与不同时间戳相关的信息)。

使用 gnuplot 创建 gif 获取灵感:Gif 无法播放我想写一些类似的东西

set terminal gif size 1000,800 animate delay 6
set output 'try.gif'

set xrange [0:1]
set yrange [0:1]

do for [i=100:40200:100] {
 ....
}

但我不知道如何向 gnuplot 指示第 i 个数据块是由最后一列给出的。有什么建议吗?

gnuplot gif
2个回答
1
投票

看起来时间戳是等距的。然后你可以尝试如下操作:

set terminal gif size 1000, 800 animate delay 100
set output 'try.gif'

# Viewing the 3D plot from top imitates a 2D plot.
set view map

set xlabel "x"
set ylabel "y"

do for [i=1100:3100:1000] {
  # Only points at time "i" are plotted.
  set zrange [i-1:i+1]
  set title "Time: ".i
  splot "data.dat" using 1:2:5 w lp
} 

在 Debian Linux 上使用 Gnuplot 4.6 进行测试。我不关心一遍又一遍地读取整个文件的性能。

运行脚本会生成这个


0
投票

@maij 的解决方案是使用

splot
zrange
绘制给定时间数据的巧妙方法。

或者,这是一种自动化方法,无需手动设置时间范围,也无需假设等距时间步长。

  • 通过绘制到表格

    smooth freq
    stats
    中获取第五列中的所有时间值,并将唯一的时间值放入字符串
    TIMES
    中。如果时间混乱的话,这也可以。

  • 使用

    do for
    循环
    TIMES
    并按
    TIME

    过滤数据
  • 对于每次迭代,您仅绘制数据的过滤部分。因此,自动缩放不是首选,因为您(可能)不希望在动画期间发生范围变化。因此,您必须从额外的

    stats
    命令获取 x 和 y 范围。

脚本:(适用于 gnuplot>=5.0.0,2015 年 1 月)

当使用文件而不是数据块时,该脚本也可能适用于某些 gnuplot 4.x 版本。

### filter data for an animated gif
reset session

$Data <<EOD
0.0 0.00209627946771 6483.0 3092622.0 1100
0.1 0.00253798848144 78.0 30733.0 1100
0.2 0.0174927113703 6.0 343.0 1100
0.3 0.0 0.0 35.0 1100
0.4 0.1 1.0 10.0 1100
0.5 0.0 0.0 4.0 1100
0.9 0.0 0.0 1.0 1100
1.0 0.0 0.0 2.0 1100
0.0 0.00292927058349 9057.0 3091896.0 2100
0.1 0.00299136583044 88.0 29418.0 2100
0.2 0.00743889479277 14.0 1882.0 2100
0.3 0.00578034682081 2.0 346.0 2100
0.4 0.0172413793103 2.0 116.0 2100
0.5 0.030303030303 1.0 33.0 2100
0.6 0.0 0.0 11.0 2100
0.7 0.0 0.0 10.0 2100
0.8 0.0 0.0 11.0 2100
0.9 0.181818181818 2.0 11.0 2100
1.0 0.0 0.0 16.0 2100
0.0 0.00318549549582 9845.0 3090571.0 3100
0.1 0.00273270708796 80.0 29275.0 3100
0.2 0.00489168413697 14.0 2862.0 3100
0.3 0.00810372771475 5.0 617.0 3100
0.4 0.010101010101 2.0 198.0 3100
EOD

set table $Temp
    plot $Data u 5 smooth freq
unset table
TIMES = ''
stats $Temp u (TIMES = TIMES.' '.strcol(1)) nooutput

stats $Data u 1:2 nooutput
set xrange[STATS_min_x:STATS_max_x]
set yrange[STATS_min_y:STATS_max_y]

myFilter(colD,colF,valF) = column(colF)==valF ? column(colD) : NaN
set datafile missing NaN

set term gif size 640,384 animate delay 100
set output "SO40026393.gif"

do for [TIME in TIMES] {
    set title sprintf("Time: %s", TIME)
    plot $Data u (myFilter(1,5,TIME)):2 w lp pt 7 lw 2 lc "red" title "data"
}
set output
### end of script

结果:

© www.soinside.com 2019 - 2024. All rights reserved.