如何让gnuplot生成的GIF动画标题随帧动态显示列头内容?
Gnuplot GIF动画:将数据块首行设为帧标题的解决方案
问题现状
你尝试用gnuplot生成GIF动画,希望每帧标题对应数据块开头的时间文本,但当前代码未达到预期效果。
你的gnuplot代码:
set terminal gif animate delay 20 set output 'gse.gif' set cbrange [0:0.00025] set xrange [-0.3:0.3] set yrange [-0.3:0.3] set ylabel "z (m)" set xlabel "x (m)" set cblabel "grain size" set rmargin at screen 0.8 do for [i=0:10] { plot 'gse.dat' index i with image title columnheader(1) }
数据集格式(每个数据块以带引号的时间行开头):
"Time: 0 years" -0.2475 -0.546333 1e-05 -0.2425 -0.546333 1e-05 ... "Time: 162 years" -0.247513 -0.546305 1e-05 ... "Time: 1674 years" -0.247631 -0.546045 1e-05 ...
问题原因
columnheader(1)是用来读取数据列的表头行(通常是数据块第一行中对应列的名称),但你的数据块第一行是单独的标题文本,不是列名,因此gnuplot无法识别为列头。此外,默认情况下gnuplot会把带引号的行当作注释忽略,导致根本读取不到这行内容。
解决方案
方案1:不修改数据集,用gnuplot内置命令提取标题
通过关闭注释符识别,再用stats命令提取每个数据块的第一行作为标题:
set terminal gif animate delay 20 set output 'gse.gif' set cbrange [0:0.00025] set xrange [-0.3:0.3] set yrange [-0.3:0.3] set ylabel "z (m)" set xlabel "x (m)" set cblabel "grain size" set rmargin at screen 0.8 # 关闭默认的注释符识别,让gnuplot读取带引号的行 set datafile commentschars '' do for [i=0:10] { # 提取第i个数据块的第一行内容作为标题 frame_title = '' stats 'gse.dat' index i u (frame_title=stringcolumn(1), 0) nooutput # 从第2行开始绘制数据(跳过标题行) plot 'gse.dat' index i every ::1 with image title frame_title }
方案2:修改数据集格式简化操作
如果可以调整数据集,把每个数据块的标题行改为不带引号的普通文本,或者明确标记为非数据行,也能实现需求。例如修改后的数据集:
# Time: 0 years -0.2475 -0.546333 1e-05 -0.2425 -0.546333 1e-05 ... # Time: 162 years -0.247513 -0.546305 1e-05 ...
然后用类似方案1的代码,只需调整stats读取逻辑(因为#是默认注释符,需要先关闭或者读取时处理),或者直接用外部命令提取标题行。
内容的提问来源于stack exchange,提问作者RomanK
相关产品推荐
相关产品推荐

