gnuplot读取文本文件日期时间绘图报空x范围错误求助
gnuplot绘制时间序列数据报空x范围错误修复
问题复现
使用的CSV数据文件data-nohead.txt内容如下:
03.07.2022,13:40:18,119.5,119.5,119.5,17.5,60.00,100.0,27.27,35.1, 03.07.2022,13:30:18,119.5,119.5,119.5,17.5,60.00,100.0,27.27,35.5, 03.07.2022,13:20:18,119.5,119.5,119.5,17.5,60.00,100.0,27.27,35.5,
原绘图脚本核心代码:
set timefmt "%d.%m.%Y,%H:%M:%S" plot 'data-nohead.txt' using ($1):2
运行后抛出报错:
"./plot_voltage.gp" line 35: Can't plot with an empty x range!
错误原因
- 未启用时间轴模式:
set timefmt仅定义时间字符串的解析规则,不会自动开启坐标轴的时间类型支持,缺少set xdata time配置时,gnuplot会默认将x轴输入解析为普通数值,无法识别时间格式字符串。 - 列引用语法错误:
($1)是对第一列做数值计算的语法,字符串类型的日期被强制转换为数值时会得到无效空值;同时日期、时间分属逗号分隔的前两列,单独引用第一列无法获取完整时间戳。 - 未指定数据分隔符:数据为逗号分隔格式,gnuplot默认按空白字符拆分列,会导致字段识别完全错乱,无法正确提取时间和绘图用的数值列。
修复方案
替换为以下可正常运行的脚本代码,可根据实际需求调整y轴对应的列号:
# 指定逗号为数据列分隔符,适配CSV格式 set datafile separator comma # 声明x轴为时间类型 set xdata time # 配置时间字符串解析规则,匹配"日.月.年,时:分:秒"格式 set timefmt "%d.%m.%Y,%H:%M:%S" # 配置x轴刻度的显示格式,示例为"月-日 时:分",可按需修改 set format x "%m-%d %H:%M" # 拼接前两列的日期、时间为完整时间戳,示例取第3列电压值作为y轴,可替换为目标列号 plot 'data-nohead.txt' using (strcol(1).",".strcol(2)):3 with linespoints
关键注意事项
- 引用字符串类型的时间列时,不要用
$()包裹列号,该语法仅适用于数值运算场景,会破坏时间字符串的解析逻辑。 - 只要使用时间格式解析,必须显式通过
set xdata time/set ydata time声明对应坐标轴的时间类型,否则timefmt配置不会生效。 - 非空白分隔的数据集必须提前通过
set datafile separator指定分隔符,否则列拆分逻辑不符合预期。
内容的提问来源于stack exchange,提问作者Roderick Stewart
相关产品推荐
相关产品推荐

