如何用gnuplot实现矩阵热力图的逐点动画效果?
Gnuplot热力图逐点动画实现(解决非方阵异常)
问题根源
gnuplot的matrix格式采用列优先存储数据,with image会将矩阵数据映射为矩形像素块。如果直接用行优先的嵌套循环遍历数据,非方阵场景下会出现图像提前填满(列数先完成遍历)但循环仍在继续的问题。
正确实现方案
方法1:利用every选项快速过滤数据(推荐)
借助matrix格式的every参数,按列优先顺序逐帧截取前N个数据点,未截取的位置自动用NaN填充,with image会忽略NaN区域,实现逐点动画。
完整代码示例
# 配置动画输出(以GIF为例) set terminal gif animate delay 100 set output "heatmap_point_anim.gif" # 数据行列数(根据实际数据修改) rows = 3 cols = 4 # 绘图基础设置 set pm3d map set xrange [0:cols] set yrange [0:rows] set cbrange [1:12] # 可替换为min(data):max(data)自动适配数据范围 unset key # 逐点循环绘制每一帧 do for [i=0:rows*cols-1] { # every :::0::i 表示仅读取matrix中第0到第i个数据点(列优先顺序) plot "test_data.txt" matrix every :::0::i with image }
方法2:手动构建临时矩阵
如果需要更精细的控制,可手动构建每个帧的临时矩阵,仅填充当前点及之前的所有数据:
set terminal gif animate delay 100 set output "heatmap_point_anim.gif" rows = 3 cols = 4 data = matrix "test_data.txt" # 将完整数据读入数组 set pm3d map set xrange [0:cols] set yrange [0:rows] set cbrange [min(data):max(data)] unset key do for [i=0:rows*cols-1] { # 计算当前点对应的列和行(列优先转换) col = int(i / rows) row = i % rows # 初始化空矩阵(填充NaN) temp = matrix NaN # 填充前col列的全部数据 do for [c=0:col-1] { do for [r=0:rows-1] { temp[r][c] = data[r][c] } } # 填充当前列的前row+1行数据 do for [r=0:row] { temp[r][col] = data[r][col] } plot temp matrix with image }
测试数据示例(test_data.txt)
1 2 3 4 5 6 7 8 9 10 11 12
异常问题说明
之前嵌套循环出现的"图像提前填满但循环仍在继续",是因为循环采用了行优先遍历,与matrix的列优先存储逻辑不匹配。非方阵场景下,列数先被遍历完成,此时矩阵的有效数据区域已覆盖整个图像范围,后续循环的行数据无法改变图像显示,但循环仍会继续执行。
内容的提问来源于stack exchange,提问作者flav
相关产品推荐
相关产品推荐

