如何在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
相关产品推荐
相关产品推荐

