Gnuplot无法生成正确动态热力图(GIF格式)问题咨询
问题:Gnuplot生成(x,y,t,e)格式数据的动态热力图失败
我的数据格式为(x, y, t, e),尝试用Gnuplot生成GIF动态热力图但遇到两个问题:
- 生成的GIF中热力图为空
- 右侧图例(颜色条)范围逐帧变化,无法固定为全局的最小/最大值
以下是我使用的代码:
set view map scale 1 set size square set xlabel("x (m)") set ylabel("y (m)") set zlabel("V/m") set title "E_z evolution" set cblabel "E (V/m)" set xrange [0:200] set yrange [0:200] set zrange [0:200] set pm3d implicit at s set pm3d corners2color max set term gif animate delay 100 set output "electric_field_evo.gif" DATA = "result.dat" stats DATA using 4 do for [i=1:int(STATS_blocks)]{ splot DATA index (i-1) every 1::1::1 using (t=$3):(NaN):(NaN) notitle, \ DATA index (i-1) using 1:2:4 with pm3d title sprintf("time = %g",t) } # do for [i=1:int(STATS_blocks)]{ # splot DATA index (i-1) using 1:2:(t=$3,$4) with pm3d title sprintf("time = %g",t) # # }
解决方案
1. 修复空热力图问题
原代码中splot命令的第一部分(DATA index (i-1) every 1::1::1 using (t=$3):(NaN):(NaN) notitle)属于冗余代码,会干扰pm3d图层的正常渲染,直接移除即可。同时需确保每个数据块(对应一个时间步)的x、y坐标是规则的网格结构——pm3d依赖完整网格才能正确绘制热力图。
2. 固定颜色条范围
通过stats命令先获取全局所有e值(第4列)的最小和最大值,再用cbrange参数锁定颜色条范围,避免gnuplot逐帧自动调整颜色区间。
修改后的完整代码
set view map scale 1 set size square set xlabel "x (m)" set ylabel "y (m)" set zlabel "V/m" set title "E_z evolution" set cblabel "E (V/m)" set xrange [0:200] set yrange [0:200] set zrange [0:200] set pm3d implicit at s set pm3d corners2color max # 获取全局e值的最小/最大值,不输出冗余统计信息 DATA = "result.dat" stats DATA using 4 nooutput # 固定颜色条范围为全局最值 set cbrange [STATS_min:STATS_max] set term gif animate delay 100 set output "electric_field_evo.gif" do for [i=1:int(STATS_blocks)]{ # 获取当前数据块的时间t(取该块第一行的t值) t_val = NaN stats DATA index (i-1) using (t_val=$3) nooutput # 绘制当前时间步的热力图 splot DATA index (i-1) using 1:2:4 with pm3d title sprintf("time = %g", t_val) }
内容的提问来源于stack exchange,提问作者CTZStef
相关产品推荐
相关产品推荐

