Hi, I want to plot a line in a specific value of x axis in a survivalplot, I tried to use an annotate data to do it. As you can see in my annotation data, that I call "anno", I using the 'LINE' function, but it is not working the way I want! I want to use my data values in the coordinates of the line, but when I put any drawspace with exception of the "GRAPHPERCENT", the function apparently does not work, any idea of what is wrong with my script? Here is my sas code:
data sp;
set sashelp.BMT;
run;
proc sgrender data=sp template=Stat.Lifetest.Graphics.ProductLimitSurvival; run;
ods document name=MyDoc(write);
proc lifetest data=sashelp.BMT plots=survival(cb=hw test);
ods output survivalplot=sp;
ods select survivalplot;
time T * Status(0);
strata Group;
run;
ods document close;
proc document name=MyDoc;
list/levels=all;
quit;
proc document name=MyDoc;
ods output dynamics=outdynam;
obdynam \Lifetest#1\SurvivalPlot#1;
quit;
data anno;
length label $100 function fillcolor linecolor $25;
retain drawspace 'datavalue' linethickness 3 display 'ALL'
widthunit 'data' heightunit 'data' anchor 'left';
Function ='LINE'; x1 = 500; y1 = 0.2; x2 = 500; y2 = 0.8; linecolor='black'; fillcolor='black';*drawspace='datavalue';
output;
run;
proc print noobs;
run;
%ProvideSurvivalMacros
%macro StmtsBeginGraph; annotate; %mend;
%CompileSurvivalTemplates
proc template;
source Stat.Lifetest.Graphics.ProductLimitSurvival / file='temp.tmp';
quit;
data _null_;
infile 'temp.tmp';
input;
if _n_ = 1 then call execute('proc template;');
call execute(_infile_);
if _infile_ =: 'BeginGraph' then bg + 1;
if bg and index(_infile_,';') then do;
bg = 0;
call execute('annotate;');
end;
run;
data _null_;
set outdynam(where=(label1 ne '___NOBS___')) end=eof;
if nmiss(nvalue1) and cvalue1= '.' then cvalue1= ' ';
if _n_ = 1 then do;
call execute('proc sgrender data=sp sganno=anno');
call execute('template=Stat.Lifetest.Graphics.ProductLimitSurvival;');
call execute('dynamic');
end;
if label1 = 'Transparency' then cvalue1 = '0.9';
if cvalue1 ne ' ' then
call execute(catx(' ', label1, '=',
ifc(n(nvalue1), cvalue1, quote(trim(cvalue1)))));
if eof then call execute('; run;');
run;
proc sgrender data=sp sganno=anno
template=Stat.Lifetest.Graphics.ProductLimitSurvival;
dynamic NSTRATA = 3 PLOTATRISK = 0 PLOTHW = 1 PLOTEP = 0 PLOTCL=0
PLOTCENSORED = 1 Transparency = 0.9 PLOTTEST = 1 PVALUE = 0.0010059117
METHOD = "Product-Limit" XNAME = "T" LABELHW = "95% Hall-Wellner Band"
SECONDTITLE="With 95% Hall-Wellner Bands" GROUPNAME = "DiseaseGroup"
TESTNAME="Logrank";
run;
proc template;
delete Stat.Lifetest.Graphics.ProductLimitSurvival;
quit;
Im following this PharmaSUG2016 documentation:
I'll try to look over what you are doing tomorrow. In the mean time, you should know that this is the latest version of the KM plot modification examples. https://support.sas.com/documentation/onlinedoc/stat/151/kaplan.pdf
In the KM chapter I mentioned, find the section "Adding a Custom Header above the At-Risk Table". It provides a basic illustration of annotation. The text mentions annotation statements. In SG plotting procedures (not relevant here but mentioned to provide context), you provide an annotation data set. In a graph template and SGRENDER, you provide annotation statements.
Registration is open! SAS is returning to Vegas for an AI and analytics experience like no other! Whether you're an executive, manager, end user or SAS partner, SAS Innovate is designed for everyone on your team. Register for just $495 by 12/31/2023.
If you are interested in speaking, there is still time to submit a session idea. More details are posted on the website.
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.