如何用gnuplot绘制带时间轴的非均匀矩阵3D曲面图?
如何用gnuplot绘制含时间轴的非均匀矩阵3D曲面图?
问题背景
我有一组矩阵数据,格式如下(实际含更多行列):
Timestamp, 45716, 45735, 45826 2025-02-26T17:25:00Z,0.027056356557038086,0.0241748257995944, 0.021441814408476034 2025-02-26T17:26:00Z,0.02705635655701144, 0.024174955904641138,0.021442529868567206 2025-02-26T17:27:00Z,0.027056356557038086,0.024174793462981015,0.021441653603027078
- 首行:第一个字段为无关字符串,后续为距离数值
- 后续行:首字段为ISO 8601时间戳,后续为对应距离的测量值
使用gnuplot 5.4版本,希望绘制3D曲面图,且时间轴仅显示时分秒(忽略日期)。单独绘制单列折线图可正常工作,但尝试用nonuniform matrix模式时出现异常:时间戳被解析为单一数值2025,触发empty y range警告,无法正常渲染时间轴。
问题原因
gnuplot的nonuniform matrix模式无法自动兼容时间轴设置:该模式会直接将首列的时间字符串当作普通文本解析,仅提取年份部分(2025)作为数值,导致所有x/y坐标值重复,进而触发范围异常警告。
解决方案
无需手动修改数据文件,通过手动映射坐标并利用时间转换函数即可实现需求,以下是两种可行方法:
方法1:手动映射坐标+timecolumn函数
利用timecolumn将时间字符串转换为gnuplot可识别的时间数值,同时读取首行的距离值作为y轴坐标,手动指定每个数据点的x/y/z:
set datafile separator ',' # 配置轴标签与时间显示格式 set format x '%H:%M:%S' timedate set xlabel '时间' set ylabel '距离' set zlabel '测量值' # 读取首行的距离值存入数组 stats 'matrix.csv' every ::0::0 nooutput dist_count = STATS_columns - 1 # 排除首列的Timestamp array distances[dist_count] do for [i=1:dist_count] { distances[i] = real(word(STATS_record, i+1)) } # 绘制曲面:遍历每个距离列,映射时间x、距离y、测量值z splot for [i=1:dist_count] 'matrix.csv' every ::1::end \ using (timecolumn(1, '%Y-%m-%dT%H:%M:%SZ')):(distances[i]):(column(i+1)) \ with surface title sprintf("距离 %d", distances[i])
方法2:预处理时间戳为相对数值(自动化)
如果更倾向于使用nonuniform matrix模式,可通过gnuplot内置命令将时间戳转换为相对起始时间的数值(比如分钟数),无需手动修改原文件:
set datafile separator ',' # 提取起始时间并计算相对分钟数 stats 'matrix.csv' every ::1::1 nooutput start_time = timecolumn(1, '%Y-%m-%dT%H:%M:%SZ') # 生成临时数据文件:替换时间戳为相对分钟数 set table 'temp_matrix.csv' plot 'matrix.csv' every ::0::0 with table, \ '' every ::1::end using ((timecolumn(1, '%Y-%m-%dT%H:%M:%SZ') - start_time)/60):2:3:4 with table unset table # 使用nonuniform matrix绘制 set xlabel '相对分钟数' set ylabel '距离' set zlabel '测量值' splot 'temp_matrix.csv' nonuniform matrix with surface # 可选:删除临时文件 !rm temp_matrix.csv
说明
- 方法1无需生成临时文件,更适合直接渲染,且能保留原始时间格式显示
- 方法2兼容
nonuniform matrix模式,适合习惯该语法的场景
内容的提问来源于stack exchange,提问作者Tom Anderson
相关产品推荐
相关产品推荐

