如何用SAS的SGPLOT绘制直方图并添加分位数标记点
在SAS中为直方图添加分位数标注点
1. 计算目标列的1%和99%分位数
使用PROC UNIVARIATE快速计算分位数并存储结果,再转成适合绘图的长格式:
/* 计算leverage列的分位数,输出到临时数据集 */ PROC UNIVARIATE DATA=test NOPRINT; VAR leverage; OUTPUT OUT=quant_data P1=q1 P99=q99; /* P1对应1%分位数,P99对应99%分位数 */ RUN; /* 转换为长格式,方便后续绘图时调用 */ DATA quant_long; SET quant_data; length quant_label $12; /* 1%分位数条目 */ quant_value = q1; quant_label = "1% 分位数"; output; /* 99%分位数条目 */ quant_value = q99; quant_label = "99% 分位数"; output; /* 设置标注点的Y轴位置(取直方图最大频数的90%,避免遮挡柱子) */ proc sql noprint; select max(freq) into :max_freq from (select count(*) as freq from test group by leverage); quit; y_pos = 0.9 * &max_freq; RUN;
2. 绘制带标注的直方图
用PROC SGPLOT组合直方图、散点标注和文本标签:
PROC SGPLOT DATA=test; /* 绘制基础直方图 */ HISTOGRAM leverage; /* 添加分位数标注点 */ SCATTER X=quant_value Y=y_pos / DATA=quant_long MARKERATTRS=(COLOR=RED SIZE=8 SYMBOL=DIAMOND); /* 添加分位数文本标注 */ TEXT X=quant_value Y=y_pos TEXT=quant_label / DATA=quant_long POSITION=TOP RIGHT TEXTATTRS=(COLOR=RED WEIGHT=BOLD SIZE=10); /* 导入CSV文件并添加自定义点(示例) */ /* 先导入CSV到SAS数据集: PROC IMPORT DATAFILE="your_file.csv" OUT=csv_data DBMS=CSV REPLACE; GETNAMES=YES; RUN; */ /* 然后添加点和标注: SCATTER X=csv_x_col Y=csv_y_col / DATA=csv_data MARKERATTRS=(COLOR=BLUE SIZE=8 SYMBOL=CIRCLEFILLED); TEXT X=csv_x_col Y=csv_y_col TEXT=csv_label / DATA=csv_data POSITION=TOP LEFT TEXTATTRS=(COLOR=BLUE WEIGHT=BOLD SIZE=10); */ RUN;
3. 批量处理6列的宏方案
如果要一次性为6列生成带分位数标注的直方图,用SAS宏循环实现:
%macro plot_all_histograms(data=, var_list=); %let var_count = %sysfunc(countw(&var_list)); %do i=1 %to &var_count; %let current_var = %scan(&var_list, &i); /* 计算当前列的分位数 */ PROC UNIVARIATE DATA=&data NOPRINT; VAR ¤t_var; OUTPUT OUT=quant_temp P1=q1 P99=q99; RUN; /* 生成绘图用的分位数数据集 */ DATA quant_long_¤t_var; SET quant_temp; length quant_label $12; quant_value = q1; quant_label = "1% 分位数"; output; quant_value = q99; quant_label = "99% 分位数"; output; proc sql noprint; select max(freq) into :max_freq from (select count(*) as freq from &data group by ¤t_var); quit; y_pos = 0.9 * &max_freq; RUN; /* 绘制直方图 */ PROC SGPLOT DATA=&data; HISTOGRAM ¤t_var; SCATTER X=quant_value Y=y_pos / DATA=quant_long_¤t_var MARKERATTRS=(COLOR=RED SIZE=8); TEXT X=quant_value Y=y_pos TEXT=quant_label / DATA=quant_long_¤t_var POSITION=TOP RIGHT TEXTATTRS=(COLOR=RED WEIGHT=BOLD); TITLE "直方图:¤t_var(含1%/99%分位数标注)"; RUN; %end; %mend; /* 调用宏,替换为你的6列名称 */ %plot_all_histograms(data=test, var_list=leverage col2 col3 col4 col5 col6);
内容的提问来源于stack exchange,提问作者Mathias Nissen
相关产品推荐
相关产品推荐

