You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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 &current_var;
            OUTPUT OUT=quant_temp P1=q1 P99=q99;
        RUN;
        
        /* 生成绘图用的分位数数据集 */
        DATA quant_long_&current_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 &current_var);
            quit;
            y_pos = 0.9 * &max_freq;
        RUN;
        
        /* 绘制直方图 */
        PROC SGPLOT DATA=&data;
            HISTOGRAM &current_var;
            SCATTER X=quant_value Y=y_pos / DATA=quant_long_&current_var MARKERATTRS=(COLOR=RED SIZE=8);
            TEXT X=quant_value Y=y_pos TEXT=quant_label / DATA=quant_long_&current_var POSITION=TOP RIGHT
                  TEXTATTRS=(COLOR=RED WEIGHT=BOLD);
            TITLE "直方图:&current_var(含1%/99%分位数标注)";
        RUN;
    %end;
%mend;

/* 调用宏,替换为你的6列名称 */
%plot_all_histograms(data=test, var_list=leverage col2 col3 col4 col5 col6);

内容的提问来源于stack exchange,提问作者Mathias Nissen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 09:35:29