Gnuplot直方图未汇总区间内全部值问题求助
Gnuplot直方图盒子叠加问题修复
问题现象
- 直方图未汇总同一区间(bin)内的所有数据,导致对应区间的盒子位置正确但彼此叠加
- 开启透明填充样式后,叠加现象会清晰显现
复现代码(中文注释版)
reset set key autotitle columnhead #======================================================================================= # 从其他通过"load"引入的脚本提取的宏定义 fs_reference_age_min = 20 # 参考年龄最小值 fs_reference_age_max = 100 # 参考年龄最大值 # 判断数值是否在[a,b)区间内 gp_is_in_range(c,a,b) = ( c > a && c <= b ) ? 1.0 : NaN # 判断年龄是否在参考范围内 fs_is_in_age_range(c) = gp_is_in_range( c, fs_reference_age_min, fs_reference_age_max ) #======================================================================================= fs_age = 'PatientAge' # 数据中的年龄列名 bin(x) = floor(x/bin_width)*bin_width # 计算数据所属区间的起始值 x_min = 0 # X轴最小值 x_max = 100 # X轴最大值 n_bins = 20 # 区间总数 bin_width = real(x_max - x_min)/n_bins # 单个区间宽度 group_boxwidth = 1 # 组盒子基准宽度 set boxwidth group_boxwidth*0.75 # 设置盒子显示宽度 set style fill transparent solid 0.3 # 开启透明填充 n = 4 offset = n # 测试数据集 $Data <<EOD Subgroup PatientAge 4 40.55 4 48.96 1 34.94 5 51.45 1 54.8 2 10.51 4 42.87 3 71.41 4 62.2 2 54.22 3 65.04 1 49.73 4 31.46 3 75.25 1 56.97 2 14.56 2 10.64 3 60.54 EOD # 原绘制命令(存在叠加问题) # plot $Data u ( bin( column(fs_age) ) + ( offset - 0.5 ) * group_boxwidth ):( @valid_age ) smooth freq w boxes lc n ti 'NORM_DB' noenhanced # 修复后的绘制命令 plot $Data u ( fs_is_in_age_range(column(fs_age)) ? (bin(column(fs_age)) + (offset - 0.5)*group_boxwidth) : NaN ):(1) smooth freq w boxes lc n ti 'NORM_DB' noenhanced
问题原因与修复思路
- 原命令将年龄有效性判断放在Y列,
@valid_age返回1或NaN,导致smooth freq无法正确汇总同一区间内的有效数据,每个有效数据点单独生成一个高度为1的盒子,最终叠加 - 修复方式:将年龄有效性判断移至X列,不符合条件的点设为
NaN(不参与绘制),Y列固定为1,确保smooth freq统计同一区间内的有效数据数量,生成单个高度对应计数的盒子
效果说明
修复后,同一区间内的所有有效数据会被汇总,每个区间仅显示一个盒子,高度等于该区间内的有效数据量,不会再出现叠加现象。
内容的提问来源于stack exchange,提问作者magfan
相关产品推荐
相关产品推荐

