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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:19:56