Gnuplot绘制含W字符串的周数数据及控制xtics增量的实现方法
Gnuplot周维度时间序列绘图修正方案
原脚本核心错误定位
- 时间格式串定义错误:待解析的周字段为
2020-W09格式,中间的W是固定文本而非时间占位符,原格式串"%Y-%s%W"无法匹配实际字符串结构 - Gnuplot字符串下标从1开始计数,原脚本用
strcol(col)[2:3]提取周数,实际取到的是年份中间的字符,导致计算出的时间戳完全错位,所有数据点堆叠在x轴最左侧 - xtics配置缺失:没有指定刻度增量,时间轴自动生成的刻度要么过密要么错位,无法匹配周维度的展示需求
分问题解决逻辑
1. ISO周格式(YYYY-Www)的时间解析
利用Gnuplot内置的%V时间占位符(对应两位ISO周数)完成解析,核心逻辑是跳过原字符串中的固定W字符,把拼接后的可识别字符串传给时间解析函数,不需要手动计算周数对应的时间偏移:
- 对
2020-W09这类字符串,提取前5位(2020-)和后2位(09),跳过第6位的W,拼接为Gnuplot可识别的2020-09 - 匹配解析格式串
%Y-%V,直接得到对应周的时间戳
2. 时间轴xtics增量控制
Gnuplot时间轴的刻度增量单位为秒,只需要按固定间隔设置即可:
- 预定义单周对应的秒数常量
SECPERWEEK = 3600*24*7 - 通过
set xtics 增量值指定刻度间隔,比如每2周一个刻度就设置为2*SECPERWEEK,可根据数据密度调整 - 自定义刻度显示格式为
"%Y-W%V",直接输出和原始数据一致的周数标签,避免格式混乱
修正后可直接运行的脚本
# 自动拉取公开检测数据 system("wget https://opendata.ecdc.europa.eu/covid19/testing/csv -P $PWD -O testing.csv") reset set term wxt font ',11' size 1200,800 set datafile separator "," set grid # 常量定义:单周对应的秒数 SECPERWEEK = 3600*24*7 # 启用时间轴模式 set xdata time # 时间解析格式:年+两位ISO周数 parse_format = "%Y-%V" # 设置xtics间隔:每2周生成一个刻度 set xtics 2*SECPERWEEK # 刻度显示格式:输出YYYY-Www样式标签 set xtics format "%Y-W%V" # 刻度标签旋转45度避免重叠 set xtics rotate by -45 # 自定义周时间解析函数:跳过原字符串中的W字符 parse_week(col) = timecolumn(col, parse_format, strcol(col)[1:5] . strcol(col)[7:8]) # 绘制法国地区的周维度曲线 plot '< grep France testing.csv' u (parse_week(3)):4 w l lw 2 notitle
常见调整提示
- 如果需要更密的刻度,把xtics的增量改为
1*SECPERWEEK即可 - 如果数据时间跨度超过3个月,可把刻度间隔调整为
4*SECPERWEEK(月度间隔),避免标签拥挤 - 不需要手动计算周数和初始日期的偏移量,Gnuplot内置的
%V占位符会自动处理ISO周的日期对应关系
内容的提问来源于stack exchange,提问作者Suntory
相关产品推荐
相关产品推荐

