如何制作刻度线性、色彩非线性的Gnuplot色条?
问题描述
我有一份数据文件,大部分数据分布在[-5:5]区间,还有部分极值数据数值约为-20。用线性色标绘图时,小量级数据无法清晰显示。我尝试过基于tanh()函数的非线性色标,想放大展示小值数据,同时在不使色标饱和的前提下呈现极值数据。
之前的Gnuplot脚本及结果如下:
#!/usr/bin/env gnuplot # width and height in inches; pixes per inch w = 12.0 h = 8.0 ppi = 150 set term pngcairo enh col size (w*ppi),(h*ppi) font ",18" set output 'mwe.png' # nonlinear cb scale functions, z in [-zmax,zmax] beta = 3.0 scale(z,zmax) = tanh(beta * (z/zmax)) invscale(z,zmax) = zmax * (atanh(z) / beta) set pm3d map interp 0,0 set palette maxcol 0 set xrange [-90:90] set yrange [80:200] set xtics -90,45,90 set nonlinear cb via scale(z,20) inverse invscale(z,20) set cbrange [-20:20] set cbtics -20,10,20 splot 'data.txt' us 1:2:7

目前脚本实现的是色条刻度非线性、色彩线性的效果,我希望改为色条刻度线性、色彩本身非线性(即拉伸色彩而非刻度),请问是否可行?
解决方案
完全可行,核心思路是直接对数据的Z值应用tanh()非线性变换,再将变换后的值映射到线性色标上——这样色条刻度保持线性,色彩会根据变换函数拉伸小值区间的分辨率,同时极值不会触发色标饱和。
修改后的脚本如下:
#!/usr/bin/env gnuplot # width and height in inches; pixels per inch w = 12.0 h = 8.0 ppi = 150 set term pngcairo enh col size (w*ppi),(h*ppi) font ",18" set output 'mwe_nonlinear_color.png' # 非线性色彩映射函数:对原始Z值做tanh变换 beta = 3.0 zmax = 20.0 color_transform(z) = tanh(beta * (z/zmax)) set pm3d map interp 0,0 set palette maxcol 0 set xrange [-90:90] set yrange [80:200] set xtics -90,45,90 # 色标范围对应tanh的输出区间[-1,1],手动绑定刻度标签与原始数据值 set cbrange [-1:1] set cbtics ( \ "-20" color_transform(-20), \ "-10" color_transform(-10), \ "0" color_transform(0), \ "10" color_transform(10), \ "20" color_transform(20) \ ) # 绘图时对原始Z值(第7列)应用色彩变换 splot 'data.txt' us 1:2:(color_transform($7))
关键改动说明:
- 移除非线性色标设置:删掉
set nonlinear cb,改为直接在绘图阶段对原始Z值做tanh()变换,用变换后的值作为色彩映射的依据。 - 线性色条刻度绑定:色标范围设为
tanh()的输出范围[-1,1],然后手动将色条刻度标签(显示原始数据的-20、-10等数值)绑定到对应原始值经过变换后的位置,确保刻度视觉上线性排列。 - 小值区间色彩拉伸:由于
tanh()在接近0的区间变化率更高,原始数据中[-5,5]的小值会被映射到色标中更宽的区间,色彩差异更明显;而极值-20会被映射到接近-1的位置,不会导致色标饱和。
内容的提问来源于stack exchange,提问作者vibe
相关产品推荐
相关产品推荐

