BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.

Hi, All:

 

 

I want to know How to Insert Custom Quantile Line to SGPLOT Graph.

Example code is following.

data test;
    input x y @@;
    datalines;
    10 10 4 5 2 5 2 4 8 4 9 6 7 6 5 2
    1 1 3 2 4 7 6 7 8 9 11 8 6 4
    ;
run;
proc univariate data=test noprint;
    var x;
    output out=pctl pctlpts=25 50 75 100 pctlpre=pctl;
run;
data test_1;
    set test;
    if _n_ eq 1 then set pctl;
    if x le pctl25 then pctlgrp=1;
    else if x le pctl50 then pctlgrp=2;
    else if x le pctl75 then pctlgrp=3;
    else if x le pctl100 then pctlgrp=4;
run;
proc sort data=test_1 out=test_2;
    by pctlgrp;
run;
ods output basicintervals=mci(where=(parameter eq "Mean"));
proc univariate data=test_2 cibasic;
    var y;
    by pctlgrp;
run;
proc univariate data=test_2 noprint;
    var x;
    by pctlgrp;
    output out=med median=med;
run;
data mci_1;
    set mci(drop=varname parameter);
run;
data test_3;
    merge test_2(in=a) med(in=b) mci_1(in=c);
    by pctlgrp;
    if a;
run;
proc sgplot data=test_3;
    reg x=x y=y / clm nomarkers;
    scatter x=med y=estimate / yerrorlower=lowercl yerrorupper=uppercl;
run;

On this graph, I want horizontal line (0th (x=1), 25th (x=3), 50th (x=6), 75th (x=8), 100th (x=11) percentile with marker line) on axis Y's "0.0", like following picture's black line.

LikeThis.JPG

I tried to insert this line by making graph from specific data, but markers "PLUS" were out of this line's end.

Thank you for your kind cooperation.

 

 

 

1 ACCEPTED SOLUTION

Accepted Solutions
FreelanceReinh
Jade | Level 19

Hi @KentaMURANAKA,

 

Have you tried the SG annotation feature?

 

First, you could include the 0th percentile in your PCTL dataset (see your first PROC UNIVARIATE step):

output out=pctl pctlpts=0 25 50 75 100 pctlpre=pctl;

 

Then use this dataset to supply coordinates to an SG annotation dataset:

%sganno; /* compile SG annotation macros */

data pctlline;
set pctl;
h=0.2; /* half the length of the vertical lines */
%sgline(x1=pctl0, y1=0, x2=pctl100, y2=0, drawspace="datavalue"); /* horizontal line */
%sgline(x1=pctl0, y1=-h, x2=pctl0, y2=h); /* first vertical line */
%sgline(x1=pctl25, x2=pctl25); /* subsequent vertical lines retain the same y-coordinates */
%sgline(x1=pctl50, x2=pctl50);
%sgline(x1=pctl75, x2=pctl75);
%sgline(x1=pctl100, x2=pctl100);
run;

(The SG annotation macros are available starting with the first maintenance release of SAS 9.4.)

 

Finally, add the SGANNO= option to your PROC SGPLOT step:

proc sgplot data=test_3 sganno=pctlline;

 

I don't know why the vertical lines seem to be shifted a little bit to the right. If this is an issue, you may want to tweak their x-coordinates, e.g.:

data pctlline;
set pctlline;
x1=x1-0.02;
x2=x2-0.02;
run;

 

View solution in original post

2 REPLIES 2
FreelanceReinh
Jade | Level 19

Hi @KentaMURANAKA,

 

Have you tried the SG annotation feature?

 

First, you could include the 0th percentile in your PCTL dataset (see your first PROC UNIVARIATE step):

output out=pctl pctlpts=0 25 50 75 100 pctlpre=pctl;

 

Then use this dataset to supply coordinates to an SG annotation dataset:

%sganno; /* compile SG annotation macros */

data pctlline;
set pctl;
h=0.2; /* half the length of the vertical lines */
%sgline(x1=pctl0, y1=0, x2=pctl100, y2=0, drawspace="datavalue"); /* horizontal line */
%sgline(x1=pctl0, y1=-h, x2=pctl0, y2=h); /* first vertical line */
%sgline(x1=pctl25, x2=pctl25); /* subsequent vertical lines retain the same y-coordinates */
%sgline(x1=pctl50, x2=pctl50);
%sgline(x1=pctl75, x2=pctl75);
%sgline(x1=pctl100, x2=pctl100);
run;

(The SG annotation macros are available starting with the first maintenance release of SAS 9.4.)

 

Finally, add the SGANNO= option to your PROC SGPLOT step:

proc sgplot data=test_3 sganno=pctlline;

 

I don't know why the vertical lines seem to be shifted a little bit to the right. If this is an issue, you may want to tweak their x-coordinates, e.g.:

data pctlline;
set pctlline;
x1=x1-0.02;
x2=x2-0.02;
run;

 

KentaMURANAKA
Pyrite | Level 9

Hi, FreelanceReinhard:

 

 

Thank you for your reply, and your code generated my objective.

201805141.JPG

Thanks a lot.

sas-innovate-2024.png

 

Time is running out to save with the early bird rate. Register by Friday, March 1 for just $695 - $100 off the standard rate.

 

Check out the agenda and get ready for a jam-packed event featuring workshops, super demos, breakout sessions, roundtables, inspiring keynotes and incredible networking events. 

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 2 replies
  • 886 views
  • 1 like
  • 2 in conversation