You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Gnuplot的GIF动画中用数据列1值替换time.j的序号j?

问题描述

基于Stack Overflow上《Gnuplot 3d time animation from data file》的回答修改了gnuplot脚本,新增了filedata2数据源。数据文件第一列为时间值(实际无表头),希望将GIF动画标题中的序号j替换为对应行的第一列时间值,当前不知如何实现。

数据示例(实际文件无表头):

0          54           89            787
0.15       90           676           345
0.70       4593         34            387
3.78       59           37            904

当前脚本:

# define fixed axis-ranges
set xrange [-1:1]
set yrange [0:20]
set zrange [-1:1]

# filename and n=number of lines of your data 
filedata1 = 'data.dat'
filedata2 = 'data2.dat'
n = system(sprintf('cat %s | wc -l', filedata1))
 
do for [j=1:n] {
    set title 'time '.j
    splot filedata1 u 2:3:4 every ::1::j w l lw 2, \
          filedata1 u 2:3:4 every ::j::j w p pt 7 ps 2,\
          filedata2 u 2:3:4 every ::1::j w l lw 2, \
          filedata2 u 2:3:4 every ::j::j w p pt 7 ps 2
}
解决方案

通过系统命令提取指定行的时间值,再格式化标题即可实现需求。修改后的脚本如下:

# 定义固定坐标轴范围
set xrange [-1:1]
set yrange [0:20]
set zrange [-1:1]

# 数据源文件及数据行数
filedata1 = 'data.dat'
filedata2 = 'data2.dat'
n = system(sprintf('cat %s | wc -l', filedata1))
 
do for [j=1:n] {
    # 提取第j行的第一列时间值,转换为数值类型
    time_val = system(sprintf('sed -n "%dp" %s | awk "{print $1}"', j, filedata1)) + 0
    # 格式化标题,可根据需求调整小数位数
    set title sprintf("time %.2f", time_val)
    
    splot filedata1 u 2:3:4 every ::1::j w l lw 2, \
          filedata1 u 2:3:4 every ::j::j w p pt 7 ps 2,\
          filedata2 u 2:3:4 every ::1::j w l lw 2, \
          filedata2 u 2:3:4 every ::j::j w p pt 7 ps 2
}

关键说明:

  • sed -n "%dp" %s提取文件第j行,awk "{print $1}"取出该行第一列的时间值
  • + 0将系统命令返回的字符串转换为数值,避免格式化时出现字符串拼接问题
  • sprintf("time %.2f", time_val)可调整时间显示格式,比如%.1f保留一位小数,%g自动去掉末尾无效零

内容的提问来源于stack exchange,提问作者hello word 439834

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:55:18