I wasn't sure which variable you wanted to used for your borders, but the code below should give you the idea on how to get the borders. I created an attributes map for the values in your "group" column. Then, I associated the map to a SCATTER statement right before the TEXT statement used to render your improvement marks. Let me know if you have any questions about the code.
Thanks!
Dan
data borders;
retain ID "borders";
length markersymbol $ 8;
input value $ markersymbol $;
cards;
Group-1 circle
Group-2 square
Group-3 triangle
;
run;
ods graphics on / height=15in;
TITLE "Patient Journey";
proc sgplot data= sample_data NOAUTOLEGEND dattrmap=borders;
SYMBOLCHAR name=markern char='FF2F'x;
SYMBOLCHAR name=markerA char='0042'x;
HIGHLOW Y = PATID LOW=first_visit_age HIGH=last_visit_age/
group = group Name= "Group" Type = bar NOMISSINGGROUP NOOUTLINE barwidth= 0.2 FILLATTRS=(TRANSPARENCY=.50);
SCATTER Y=PATID X=TRT1_Age/
markerattrs=(symbol=markerA size=14) name="T1" legendlabel="Treatment 1";
SCATTER Y=PATID X=TRT2_Age/
markerattrs=( symbol=markern size=13) name="T2" legendlabel="Treatment 2" ;
SCATTER Y=PATID X=improvement_test_age/ markerattrs=( size=3) Name = "Improvement Marks";
SCATTER Y=PATID X=improvement_test_age/ markerattrs=(size=11 color=black) attrid=borders group=group;
TEXT Y=PATID X=improvement_test_age text=improvement_marks / textattrs=(color=black size=5) strip;
XAXIS LABEL="Age (months)" VALUES=(0 TO 600 BY 25 ) valueshint ;
YAXIS LABEL="Patient ID" type=discrete fitpolicy=none;
keylegend "T1" "T2" "Group" "Improvement Marks";
RUN;
... View more