Gnuplot 5.4时间格式数据与解析函数叠加绘图问题求助
解决Gnuplot时间轴叠加解析函数的问题
核心问题分析
你的代码报错和功能失效主要来自三个关键点:
- 时间格式设置与数据实际格式不匹配
- 直接用字符串进行数值比较的逻辑错误
- 未结合Gnuplot的时间数值机制完成时间与位置的转换
修正步骤与完整代码示例
1. 匹配数据的时间格式
你的数据时间格式为YYYY-MM-DDTHH:MM:SS.ssssssZ,需对应调整timefmt参数,或者提取有效时间部分进行转换:
set xdata time # 匹配数据的基础时间格式,忽略末尾的小数和Z标识 set timefmt "%Y-%m-%dT%H:%M:%S" # 设置横轴显示格式 set format x "%d %b\n%H:%M:%S" # 设置横轴范围,与数据范围对应 set xrange ["2022-02-16T21:22:28":"2022-02-16T23:46:28"]
2. 将时间字符串转为可计算的数值
使用strptime函数把时间字符串转换为Gnuplot内部的秒级数值,才能进行范围判断和计算:
# 定义函数的有效时间范围字符串 t1_str = "15-Feb-2022 23:30:28" t2_str = "16-Feb-2022 07:27:28" # 转换为秒级数值 t1_num = strptime("%d-%b-%Y %H:%M:%S", t1_str) t2_num = strptime("%d-%b-%Y %H:%M:%S", t2_str)
3. 修正时间与位置的转换逻辑
根据time = x/velocity(x为位置),反推时间轴x(秒)对应的位置值:x_pos = (x - t_offset) * velocity,其中t_offset是偏移量,用于让函数曲线与实测数据对齐。同时添加范围限制:
velocity = 0.000278 # 示例速度值,需根据你的实际数据调整 # 偏移量:用于对齐函数曲线和数据,可根据实际情况修改 t_offset = strptime("%Y-%m-%dT%H:%M:%S", "2022-02-16T21:20:00") # 定义带范围限制的函数:仅在t1_num到t2_num范围内绘制,否则返回无效值 f_t(x) = (x >= t1_num && x <= t2_num) ? ((x - t_offset) * velocity)**2 : 1/0
4. 处理数据中的异常字符
第一行数据末尾有多余的.,可以用substr截断有效时间部分,确保Gnuplot正确解析:
# 绘制实测数据和函数曲线 plot "data.txt" using (strptime("%Y-%m-%dT%H:%M:%S", substr(stringcolumn(1),1,19))):2 title "实测数据", \ f_t(x) title "f(x)=x²" with lines
关键调整说明
- 反复调整
velocity和t_offset的数值,直到函数曲线与数据趋势匹配 - 如果需要保留数据中的小数时间,可将
timefmt改为%Y-%m-%dT%H:%M:%S.%6,并对应调整substr的截取长度 1/0用于让函数在指定范围外不绘制,避免生成无效数据点
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

