You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 04:27:20