Gnuplot粒子动画中如何在标签内实时显示数据列压强值
可行性说明
这个需求完全可以实现。你当前的代码存在几处逻辑错位,调整后就能做到压强值和动画帧严格同步显示。
现有代码的核心问题
- 取数范围不对:你用
stats命令全文件扫描取压强值,没有限定到当前正在绘制的动画帧对应的分块,取到的是全文件的整体统计值,不是当前帧的压强 - 列号错位:你提到压强值存储在第4列,但代码里写的是
using 5,本身就读错了列 - 格式化逻辑缺失:
sprintf("Pression : ", pression)没有加数值占位符,就算取到了压强值也不会显示在文字里 - 标签未清理:每轮循环没有清除上一帧的旧标签,多轮循环后会出现文字层层叠加的问题
调整后的可运行代码
# 原有绘图样式配置保留 set title "Mouvement de particules d'Hélium (R = 3e-2 {/Helvetica=10 \305) \n sur une surface de 4 {/Helvetica=10 \305^{2}}" set xlabel "L {/Helvetica=10 (\305)}" set ylabel "L {/Helvetica=10 (\305)}" set style line 2 lc rgb 'blue' pt 7 set style fill solid 0.4 unset key set size square infile = 'particules.dat' total_frames = 21 # 逐帧循环绘制动画 do for [i=0:total_frames] { # 清除上一帧残留的旧标签 unset label 1 # 仅统计当前i号分块的第4列压强值,不扫描全文件 stats index i infile using 4 name 'press' nooutput # 格式化压强数值到标签文本,固定放置在屏幕左上角区域 set label 1 sprintf("Pression : %.2f", press_mean) at screen 0.2,0.9 # 绘制当前帧的粒子位置 plot infile index i using 1:2 with circles ls 2 pause 1.0 }
适配说明
- 如果每一个分块内所有粒子行共享同一秒的压强值(也就是同块内第4列数值完全一致),用
press_mean取到的就是准确的当前帧压强值 - 如果实际存储压强的列号和记忆有偏差,可以先单独执行
stats index 0 'particules.dat'查看列统计结果,把using后的数字改成对应压强列的编号即可 - 如果压强值单独存在分块的特定行(比如块首的独立数据行),可以给stats加
every参数精准定位该行,不需要取整列均值
内容的提问来源于stack exchange,提问作者Michel Chance
相关产品推荐
相关产品推荐

