Hello,
I wish to switch the sequence of my tick values on my x-axis. For some reason the logic in my code has shifted the labels for each box plot. for e,g, 'No-Diabetes' is actually equal to 'T1DM' is actually 'T2DM'. However, the data is represented okay. Below is my complicated code-
data cytofpercent_scatter ;
set cytofpercent ;
Diagnosis_n = ifn(Diagnosis = 'T1DM', 1, ifn(Diagnosis = 'T2DM', 2, 3));
if Diagnosis="T1DM" then T1DM=-1+0.1*rannor(0);
if Diagnosis="T2DM" then T2DM=1.5+0.1*rannor(0);
if Diagnosis="No-Diabetes" then NoDiabetes=4+0.1*rannor(0);
run;
proc format;
value Diagnosis
1 = 'T1DM'
2 = 'T2DM'
3 = 'No-Diabetes'
;
run;
proc sort data=cytofpercent ;
by Donor;
run;
proc template;
define statgraph cytof.scatter;
begingraph;
entryTitle "PP CELL DISTRIBUTION";
layout overlay / x2axisopts=(display=none)
xaxisopts=(display=(tickvalues) linearopts=(tickValuelist=(2 1 3) tickvalueformat=Diagnosis.))
yaxisopts= (label= "PP Cell Percentage (%)" labelattrs=(weight=bold))
walldisplay=none ;
boxplot x=Diagnosis y=PP_cells_percentage / display=(caps mean median)
fillattrs=(color=white)
meanattrs=(color=Black symbol=diamondFilled) ;
scatterplot x=T1DM y=PP_cells_percentage / xaxis=x2 markerattrs=(color=blue symbol=circleFilled) ;
scatterplot x=T2DM y=PP_cells_percentage / xaxis=x2 markerattrs=(color=red symbol=circleFilled);
scatterplot x=NoDiabetes y=PP_cells_percentage / xaxis=x2 markerattrs=(color=green symbol=circleFilled);
endlayout;
endgraph;
end;
run;
ods listing style=listing;
proc sgrender data=cytofpercent_scatter
template="cytof.scatter";
run;
If T2DM and T1DM are switched, it could be because of the tickValuelist= option:
proc template;
...
*** the order of tick value list is T2DM (2), T1DM (1), No-Diabetes (3);
xaxisopts=(display=(tickvalues) linearopts=(tickValuelist=(2 1 3) tickvalueformat=Diagnosis.))
yaxisopts= (label= "PP Cell Percentage (%)" labelattrs=(weight=bold))
walldisplay=none ;
boxplot x=Diagnosis y=PP_cells_percentage / display=(caps mean median)
fillattrs=(color=white)
meanattrs=(color=Black symbol=diamondFilled) ;
*** the order of scatterplot statements and color symbols is T1DM, T2DM, No-Diabetes;
scatterplot x=T1DM y=PP_cells_percentage / xaxis=x2 markerattrs=(color=blue symbol=circleFilled) ;
scatterplot x=T2DM y=PP_cells_percentage / xaxis=x2 markerattrs=(color=red symbol=circleFilled);
scatterplot x=NoDiabetes y=PP_cells_percentage / xaxis=x2 markerattrs=(color=green symbol=circleFilled);
endlayout;
endgraph;
end;
run;
Hello Pink_Poodle!
Thank you so much for your response.
I have actually tried with tickValuelist=(1 2 3) option as well. With that, the position of T1DM and T2DM box-plot changes, but the data represented then becomes correct. I tried something new- Look for the color code. I created new dummy variables to convert my x-axis dummy variables to numeric variable. I have a feeling the issue could be in the dataset?
data cytofpercent_scatter ;
set cytofpercent ;
if Diagnosis ='T1DM' then T1DM= 2 ;
If Diagnosis ='T2DM' then T2DM= 1 ;
else if Diagnosis ='No-Diabetes' then NoDiabetes=3 ;
run ;
/* Convert numeric values back to categories for axis display */
proc format;
value Diagnosis
2 = 'T1DM'
1 = 'T2DM'
3 = 'No-Diabetes'
;
run;
proc sort data=cytofpercent_scatter ;
by Donor;
run;
proc template;
define statgraph cytof.overlay;
begingraph;
entryTitle "PP CELL DISTRIBUTION";
layout overlay / x2axisopts=(display=none)
xaxisopts=(display=(tickvalues) linearopts=(tickvaluelist=(1 2 3) tickvalueformat=Diagnosis.))
yaxisopts= (label= "PP Cell Percentage (%)" labelattrs=(weight=bold))
walldisplay=none ;
boxplot x=Diagnosis y=PP_cells_percentage / display=(caps median mean connect)
connect=median
connectattrs=(color=Black pattern=4)
fillattrs=(color=white)
meanattrs=(color=Black symbol=diamondFilled) ;
scatterplot x=eval(0.08*rannor(57)+T1DM) y=PP_cells_percentage / xaxis=x2 markerattrs=(color=blue symbol=circleFilled) ;
scatterplot x=eval(0.08*rannor(57)+T2DM) y=PP_cells_percentage / xaxis=x2 markerattrs=(color=red symbol=circleFilled);
scatterplot x=eval(0.08*rannor(57)+NoDiabetes) y=PP_cells_percentage / xaxis=x2 markerattrs=(color=green symbol=circleFilled);
endlayout;
endgraph;
end;
run;
ods listing style=listing;
proc sgrender data=cytofpercent_scatter
template="cytof.overlay";
run;
Hi nsamanta,
This is a very nice code. One interesting thing I found out is that a tick value list does no have to be numeric. That could eliminate the format step:
Thank you!
I will try this option again then. I kept reading everywhere that it has to be a Numeric value.
Also is there a plotting option where I can just show the scatter/Jitter for each x-axis group and the Median line? i.e. no boxplot in the background?
best,
You are right, tick value list can only be numeric:
The question about boxes would require modification of the box plot statement. Here are the options for that:
It could be possible to conceal the boxes by using the box width option with boxwidth = 0.
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
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.
Ready to level-up your skills? Choose your own adventure.