如何让SAS SGPLOT热图Y轴按数值排序而非字典序?
解决离散型热图Y轴数值排序及全类别显示问题
问题根源
当StationArea作为离散轴(discretey)时,SAS会把数值型变量按字符串逻辑处理,所以discreteorder=formatted或unformatted都会触发字典序排序;另外默认仅显示有数据的类别,导致你排序后只看到B01响应过的StationArea值。
解决方案
方法一:全量数据集合并法(推荐,适合类别较多的场景)
生成包含所有StationArea值的数据集
先创建一个包含你需要展示的全部StationArea数值的数据集,比如要显示1到20:data all_stations; do StationArea = 1 to 20; output; end; run;合并原数据集与全量数据集
将原数据和全量StationArea数据合并,保留所有类别,缺失数据自动补空:data Heatmap_full; merge all_stations Heatmap; by StationArea; run;按数值排序数据集
确保数据集按StationArea的数值顺序排列:proc sort data=Heatmap_full; by StationArea; run;修改SGPlot代码
用discreteorder=data(或省略该参数,默认按数据集顺序)实现数值排序,同时所有StationArea都会显示:proc sgplot data=Heatmap_full; yaxis discreteorder=data; heatmap x=Battalion y=StationArea / name='HeatMap' discretey discretex colorresponse=arrive_seconds colorstat=mean; gradlegend 'HeatMap'; run;
方法二:手动指定Y轴值顺序(适合类别较少的场景)
如果StationArea数量不多,可以直接在yaxis的values选项里按数值顺序列出所有值,配合discreteorder=value强制按指定顺序排序:
proc sgplot data=Heatmap; yaxis values=(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20) discreteorder=value; heatmap x=Battalion y=StationArea / name='HeatMap' discretey discretex colorresponse=arrive_seconds colorstat=mean; gradlegend 'HeatMap'; run;
内容的提问来源于stack exchange,提问作者AlexStudentCSU
相关产品推荐
相关产品推荐

