Gnuplot夜间跨午夜时间区间柱状图绘制问题求助
Gnuplot夜间跨午夜时间区间柱状图绘制问题求助
问题诊断
你遇到的核心问题是跨午夜的时间区间(如22:40到次日03:20)无法正常渲染:因为timecolumn()返回的03:20时间戳会小于22:40,导致boxxyerror的X方向范围反向,图形无法正确显示。另外你尝试修改xrange和手动添加xtics的方式,没有从根本上解决时间区间的有效性问题,也没匹配上“X轴18:00-06:00、午夜居中”的核心需求。
修正后的完整代码
下面是完全符合你需求的代码,包含跨午夜时间处理、X轴的正确范围和刻度设置:
reset session $Data <<EOD 06.03.2019 09:45 11:17 07.03.2019 22:40 03:20 EOD StartDay = "06.03.2019" # 计算当前日期相对于起始日期的Y轴偏移量(用于Y轴排序) DaysAfterStartDay(day) = int((strptime("%d.%m.%Y", day) - strptime("%d.%m.%Y", StartDay)) / 86400) set xdata time set timefmt "%H:%M" set format x "%H:%M" # 核心:处理跨午夜的时间区间 # 如果结束时间戳 < 开始时间戳,说明跨了午夜,给结束时间加24小时(86400秒) get_valid_end_time(start_col, end_col) = ( t_start = timecolumn(start_col), t_end = timecolumn(end_col), t_end < t_start ? t_end + 86400 : t_end ) # 设置X轴范围:从当日18:00到次日06:00(共12小时,午夜正好在中心) set xrange ["18:00":"06:00" + 86400] # 自定义X轴刻度,让午夜居中显示 set xtics ("18:00" 18*3600, "21:00" 21*3600, "00:00" 24*3600, "03:00" 27*3600, "06:00" 30*3600) set xtics center rotate by 30 # 绘制带误差的矩形(boxxyerror),Y轴显示日期 plot $Data u (t_start=timecolumn(2)):(y=DaysAfterStartDay(strcol(1))): \ (t_start):(get_valid_end_time(2, 3)):(y-0.2):(y+0.2):ytic(1) w boxxyerror \ fs solid 1.0 lc rgb "blue" notitle, \ # 可选:添加午夜参考线,方便观察 NaN u (24*3600):(y) w l lc rgb "red" dt 2 title "Midnight"
关键优化说明
跨午夜时间修复:
新增get_valid_end_time()函数,自动判断结束时间是否跨午夜——如果结束时间戳小于开始时间,就加上24小时,保证X方向的区间为正,矩形能正确绘制。X轴精准匹配需求:
xrange ["18:00":"06:00"+86400]直接定义了12小时的时间范围,让午夜(24:00)刚好处于X轴中心位置。- 自定义
xtics刻度,清晰标注18:00、21:00、00:00、03:00、06:00,完全符合你“X轴从18:00到06:00”的要求。
图形样式优化:
调整了xtics的旋转角度和居中,避免标签重叠;Y轴的日期标签直接使用原始数据的第一列,保持可读性。
额外提示
如果你的数据中有更早或更晚的时间区间,只需要调整xrange的范围即可。比如要显示17:00到07:00,只需要把xrange改成["17:00":"07:00"+86400],并同步更新xtics标签。
如果还有其他细节需要调整(比如柱状图颜色、Y轴间距等),随时告诉我!
备注:内容来源于stack exchange,提问作者user25865121
相关产品推荐
相关产品推荐

