gpt4 book ai didi

PROC SGPLOT中curvelabelpos和xaxis的SAS问题

转载 作者:行者123 更新时间:2023-12-04 10:39:58 26 4
gpt4 key购买 nike

我目前正在尝试在 SAS 中使用 PROC SGPLOT 创建一个包含五行(8 年级、10 年级、12 年级、大学生和年轻人)的系列图。 yaxis 是药物使用流行率的百分比,范围为 0-100。 xaxis 是 1975-2019 年,但已格式化(使用 proc 格式),以便将年份值显示为 '75-'19。我想使用其各自的组(8 年级 - 年轻成人)标记每一行。但是当我使用:

proc sgplot data = save.fig2_1data noautolegend ;
series x=year y=eighth / lineattrs=(color=orange) curvelabel='8th Grade' curvelabelpos=start ;
series x=year y=tenth / lineattrs=(color=green) curvelabel='10th Grade' curvelabelpos=start ;
series x=year y=twelfth / lineattrs=(color=blue) curvelabel='12th Grade' curvelabelpos=start;
series x=year y=college / lineattrs=(color=red) curvelabel='College Students' curvelabelpos=start;
series x=year y=youngadult / lineattrs=(color=purple) curvelabel='Young Adults' curvelabelpos=start ;
xaxis label="YEAR" values=(1975 to 2019 by 2) minor;
yaxis label="PERCENT" max=100 min=0 ;
format year yr. ; run ;

Series Plot enter image description here

“curvelabelpos=”没有提供将我的标签放置在“12 年级”和“大学生”的第一个数据点上方的选项,这样我的 xaxis 就没有图左侧的所有空间。如何将这两个标签移动到每条线的第一个数据点上方,以便 xaxis 没有空白空间?

最佳答案

没有series将产生您想要的标签的语句选项。

您必须为 sgplot 创建一个注释数据集。 .

在此示例代码中 curvelabel=选项设置为 ''因此该过程会生成一条使用最宽水平绘图空间的系列线。 sganno数据集包含注释函数,这些函数将在带有空白曲线标签的系列的第一个数据点附近绘制您自己的曲线标签文本。调整 %sgtext anchor=根据需要值。请务必阅读 SG Annotation Macro Dictionary文档以了解所有文本注释功能。

对于想要在系列线路中进行人为拆分的情况,有两件事可以尝试:

  • 引入一个假年份 2012.5,其中没有一个系列变量具有值。我试过这个,但只有 5 个系列中的 1 个使用“假”拆分。
  • 为需要拆分的 N 行引入 N 个新变量。对于拆分后的时间范围,将数据复制到新变量中,并将原始数据设置为缺失。
  • 添加 SERIES新变量的声明。
  • data have;
    call streaminit(1234);

    do year = 1975 to 2019;
    array response eighth tenth twelfth college youngadult;

    if year >= 1991 then do;
    eighth = round (10 + rand('uniform',10), .1);
    tenth = eighth + round (5 + rand('uniform',5), .1);
    twelfth = tenth + round (5 + rand('uniform',5), .1);

    if year in (1998:2001) then tenth = .;
    end;
    else do;
    twelfth = 20 + round (10 + rand('uniform',25), .1);
    end;

    if year >= 1985 then do;
    youngadult = 25 + round (5 + rand('uniform',20), .1);
    end;

    if year >= 1980 then do;
    college = 35 + round (7 + rand('uniform',25), .1);
    end;

    if year >= 2013 then do _n_ = 1 to dim(response);
    %* simulate inflated response level;
    if response[_n_] then response[_n_] = 1.35 * response[_n_];
    end;

    output;
    end;
    run;

    data have_split;
    set have;
    array response eighth tenth twelfth college youngadult;
    array response2 eighth2 tenth2 twelfth2 college2 youngadult2;

    if year >= 2013 then do _n_ = 1 to dim(response);
    response2[_n_] = response[_n_];
    response [_n_] = .;
    end;
    run;

    ods graphics on;
    ods html;

    %sganno;

    data sganno;
    %* these variables are used to track '1st' or 'start' point
    %* of series being annotated
    ;
    retain y12 ycl;

    set have;
    if missing(y12) and not missing(twelfth) then do;
    y12=twelfth;
    %sgtext(label="12th Grade", textcolor="blue", drawspace="datavalue", anchor="top", x1=year, y1=y12, width=100, widthunit='pixel')
    end;

    if missing(ycl) and not missing(college) then do;
    ycl=college;
    %sgtext(label="College Students", textcolor="red", drawspace="datavalue", anchor="bottom", x1=year, y1=ycl, width=100, widthunit='pixel')
    end;
    run;


    proc sgplot data=have_split noautolegend sganno=sganno;
    series x=year y=eighth / lineattrs=(color=orange) curvelabel='8th Grade' curvelabelpos=start;*auto curvelabelloc=outside ;
    series x=year y=tenth / lineattrs=(color=green) curvelabel='10th Grade' curvelabelpos=start;*auto curvelabelloc=outside ;
    series x=year y=twelfth / lineattrs=(color=blue) curvelabel='' curvelabelpos=start;*auto curvelabelloc=outside ;
    series x=year y=college / lineattrs=(color=red) curvelabel='' curvelabelpos=start;*auto curvelabelloc=outside ;
    series x=year y=youngadult / lineattrs=(color=purple) curvelabel='Young Adults' curvelabelpos=start;*auto curvelabelloc=outside ;

    * series for the 'shifted' time period use the new variables;
    series x=year y=eighth2 / lineattrs=(color=orange) ;
    series x=year y=tenth2 / lineattrs=(color=green) ;
    series x=year y=twelfth2 / lineattrs=(color=blue) ;
    series x=year y=college2 / lineattrs=(color=red) ;
    series x=year y=youngadult2 / lineattrs=(color=purple) ;

    xaxis label="YEAR" values=(1975 to 2019 by 2) minor;
    yaxis label="PERCENT" max=100 min=0 ;
    run ;

    ods html close;
    ods html;

    enter image description here

    关于PROC SGPLOT中curvelabelpos和xaxis的SAS问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59974818/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com