GNUPlot splot处理超范围值:无数据z值自定义配色及图例设置
解决方案
直接修改gnuplot脚本即可实现需求,修改后不会改变原有0~60有效数值区域的配色逻辑,无效值区域固定显示为紫色,色条同步增加无结果标注。
修改后完整可运行脚本
set terminal png large size 1600,\ 1200 font arial 24 crop set output "map.png" # 扩展调色板:保留原有0~60区间的绿-黄-红渐变,新增61位置绑定紫色作为无结果色 set palette model RGB defined (\ 0 "dark-green",\ 8.6 "forest-green",\ 17.1 "green",\ 25.7 "light-green",\ 34.3 "dark-yellow",\ 42.9 "yellow",\ 51.4 "red",\ 60 "dark-red",\ 61 "purple"\ ) set xrange[-180.00: 180.00] set yrange[ -90.00: 90.00] # 调整z轴/色条范围,覆盖到无效值映射位61,避免值被截断显示为白色 set zrange[0:61] set cbrange[0:61] set grid set pm3d map set xlabel "Longitude [deg]" set ylabel "Latitude [deg]" unset key set cblabel "Time [h]" # 配置色条刻度:保留0~60每10小时的常规刻度,在61位置添加无结果标注 set cbtics 0,10,60 set cbtics add ("无结果" 61) set cbmtics off # 关闭色条次要刻度,避免显示混乱 # 读取数据时增加判断:z值为9999时映射为61,否则保留原始z值 splot "output\\map.dat" u 5:6:($8 == 9999 ? 61 : $8),\ "input\\world.dat" u 1:2:(0.00) w l lw 1 lt -1
核心修改点说明
- 无效值映射:读取热力图数据时通过三元运算符
$8 == 9999 ? 61 : $8做值替换,将9999的超大无效值统一转换为仅比有效上限高1的固定值61,既不会拉伸色阶导致有效区域配色失真,也不会因值超出zrange范围被截断为白色。 - 调色板适配:原有8个色阶按比例映射到0~60的有效数值区间,和修改前的显示效果完全一致;新增61位置绑定紫色,因为有效数据最高为60、无效数据固定为61,两个区间无过渡值,不会出现多余渐变。
- 标注配置:直接在色条对应紫色块的位置添加“无结果”刻度标注,和原有“Time [h]”的色条说明逻辑统一,不需要额外新增独立图例。
- 边界逻辑兼容:原有世界海岸线绘制逻辑完全保留,边界线使用固定黑色线型,不受调色板配置影响。
如果需要更换无结果区域的颜色,只需要修改调色板定义中61位置对应的颜色值即可,比如改成灰色、黑色都可以直接替换。
内容的提问来源于stack exchange,提问作者Florian
相关产品推荐
相关产品推荐

