/*--Adverse Events timeline data--*/ data ae0; retain aestdateMin; retain aeendateMax; attrib aestdate informat=yymmdd10. format=date7.; attrib aeendate informat=yymmdd10. format=date7.; format aestdateMin aeendateMax date7.; drop aestdateMin aeendateMax; input aeseq aedecod $ 5-39 aesev $ aestdate aeendate; aestdateMin=min(aestdate, aestdateMin); aeendateMax=max(aeendate, aeendateMax); call symputx('mindate', aestdateMin); call symputx('maxdate', aeendateMax); y=aeseq; yc=y+0.25; if aedecod="DUMMY" then y=-100; cards; 1 DUMMY MILD 2013-03-06 2013-03-06 3 3 1 DUMMY MODERATE 2013-03-06 2013-03-06 3 3 1 DUMMY SEVERE 2013-03-06 2013-03-06 3 3 1 DIZZINESS MODERATE 2013-03-06 2013-03-06 3 3 2 COUGH MILD 2013-03-20 . 17 . 3 APPLICATION SITE DERMATITIS MILD 2013-03-26 2013-06-18 23 107 4 DIZZINESS MILD 2013-03-27 2013-03-27 24 24 5 ELECTROCARDIOGRAM T WAVE INVERSION MILD 2013-03-30 . 27 . 6 DIZZINESS MILD 2013-04-01 2013-04-11 29 39 7 DIZZINESS MILD 2013-04-01 2013-04-11 29 39 8 APPLICATION SITE DERMATITIS MODERATE 2013-03-26 2013-06-18 23 107 9 HEADACHE MILD 2013-05-17 2013-05-18 75 76 10 APPLICATION SITE DERMATITIS MODERATE 2013-03-26 2013-06-18 23 107 11 PRURITUS MODERATE 2013-05-27 2013-06-18 85 107 ; run; /*--Evaluate min and max day and dates--*/ data _null_; set ae0; minday=0; maxday= &maxdate - &mindate; call symputx('minday', minday); call symputx('maxday', maxday); run; /*--Compute start and end date and days and X position of event name--*/ data ae1; set ae0; aestdy= aestdate-&mindate; aeendy= aeendate-&mindate; startday=aestdy; endday=aeendy; if aestdy=. then startday=&minday; if aeendy=. then endday=&maxday; run; /*--Custom style for severity of events--*/ proc template; define Style AETimeline; parent = styles.listing; style GraphColors from graphcolors / "gcdata" = cx000000 "gcdata1" = cx1fcf1f "gcdata2" = cxdfbf1f "gcdata3" = cxbf1f1f; style GraphFonts from GraphFonts / 'GraphDataFont' = (", ",7pt) 'GraphValueFont' = (", ",7pt) 'GraphTitleFont' = (", ",11pt); end; run; /*--Draw the Graph--*/ %let gpath='C:\Work\Blogs\Graphically Speaking\2012\Post_05Mar_2012_AE_Timeline_2'; ods listing style=AETimeline image_dpi=100 gpath=&gpath; ods graphics / reset labelmax=1 width=6in height=4in imagename="Fig12_5_AE_Timeline_2_V92"; title "Adverse Events for Patient Id = xx-xxx-xxxx"; proc sgplot data=ae1 noautolegend nocycleattrs; /*--Draw the events--*/ vector x=endday y=y / xorigin=startday yorigin=y noarrowheads lineattrs=(thickness=9px); vector x=endday y=y / xorigin=startday yorigin=y noarrowheads lineattrs=(thickness=7px pattern=solid) transparency=0 group=aesev name='sev'; /*--Draw start and end events--*/ scatter x=aestdy y=y / markerattrs=(size=13px symbol=trianglefilled); scatter x=aestdy y=y / markerattrs=(size=9px symbol=trianglefilled) group=aesev; scatter x=aeendy y=y / markerattrs=(size=13px symbol=trianglefilled); scatter x=aeendy y=y / markerattrs=(size=9px symbol=trianglefilled) group=aesev; /*--Draw the event names--*/ scatter x=aestdy y=yc / datalabel=aedecod markerattrs=(size=0); /*--Assign dummy plot to create independent X2 axis--*/ scatter x=aestdate y=y / markerattrs=(size=0) x2axis; /*--Assign axis properties data extents and offsets--*/ yaxis display=(nolabel noticks novalues) min=1; xaxis grid label='Study Days' offsetmin=0.02 offsetmax=0.02 values=(&minday to &maxday by 2); x2axis notimesplit display=(nolabel) offsetmin=0.02 offsetmax=0.02 values=(&mindate to &maxdate); /*--Draw the legend--*/ keylegend 'sev'/ title='Severity :'; run;