Gnuplot如何按昼夜时段设置时序图背景色并保留缩放功能
Gnuplot 长时序昼夜背景实现方案
核心用单条splot命令同时渲染背景层和数据曲线,完全规避multiplot带来的缩放不同步问题,全程不占用y轴做颜色映射,性能完全适配你10秒分辨率、数十万秒跨度的数据集。
- 颜色映射完全绑定时间轴(x轴)的昼夜状态值,y轴全程只用于展示实际时序数据的数值,不会被颜色逻辑占用
- 背景层放在绘图区最底部,数据曲线抬升到背景层上方绘制,不需要额外叠加图层
- 支持连续渐变/硬边分块两种效果,渲染负载和你原绘图逻辑几乎无差异,不会增加额外加载延迟
- 所有元素在同一个坐标系内,缩放、平移操作完全正常,不会出现图层错位
核心配置逻辑
- 自定义调色板:0值对应夜间深蓝色,1值对应白天白色,默认线性插值生成晨昏过渡效果,切换为硬边阈值即可实现块状昼夜分块
- pm3d配置为贴在绘图区最底层,关闭多余边框,按x轴采样点匹配颜色
- 用
+伪文件生成和你数据采样率对齐的背景网格,不需要额外高分辨率插值,避免冗余计算 - 实际数据曲线的z值统一设为高于背景层的固定值,直接用线图模式绘制,不参与颜色映射
可直接运行的测试代码
测试阶段直接用1天(86400秒)周期的正弦函数模拟昼夜值,后续替换成你自己的昼夜时长计算逻辑即可:
# 基础边距配置 unset colorbox set tmargin at screen 0.95 set bmargin at screen 0.1 set lmargin at screen 0.12 set rmargin at screen 0.95 # 自动统计数据y轴范围,预留5%边距 stats 'your_data_file.csv' using 2 nooutput y_min = STATS_min - (STATS_max - STATS_min)*0.05 y_max = STATS_max + (STATS_max - STATS_min)*0.05 set yrange [y_min:y_max] set xrange [0:3*86400] # 示例设为3天跨度,按你实际数据范围调整 # 测试用昼夜值函数:0为深夜,1为正午,1天周期 day_cycle = 86400 day_val(t) = 0.5 + 0.5*sin(2*pi*t/day_cycle) # 调色板配置:连续渐变效果 set palette defined (0 '#0a194d', 0.3 '#2b488a', 0.7 '#f2f2f7', 1 '#ffffff') # 要硬边块状昼夜效果,注释上面一行,取消下面这行注释即可 # set palette defined (0 '#0a194d', 0.5 '#0a194d', 0.5001 '#ffffff', 1 '#ffffff') # pm3d底层配置 set pm3d at b set pm3d noborder set pm3d corners2color c1 set samples 25920 # 3天*86400秒/10秒采样率=25920点,和你数据分辨率对齐 set isosamples 2 # y方向只需要2个点就能铺满整个y轴范围,最小化渲染负载 # 单条命令同时绘制背景+数据,缩放完全同步 splot \ '+' using 1:(y_min + (y_max-y_min)*$2):(day_val($1)) with pm3d notitle, \ 'your_data_file.csv' using 1:2:(1) with lines lc 'black' lw 1.2 title '实测时序数据'
效果参考

性能说明
背景层y方向只需要2个采样点就能铺满整个y轴范围,总采样点数和你原数据集的x轴采样点数量完全一致,不会产生冗余渲染压力,和你原来单独plot数据的加载速度基本没有差别。
内容的提问来源于stack exchange,提问作者Karl
相关产品推荐
相关产品推荐

