I have been trying to reproduce the attached graph using the following data but I have not been able to find an example that fits it perfectly. I need help urgently I have been on it for over a week and am at my wits end.
data NAR;
input Drug$ Time Meanlog_NAR @@;
cards;
Placebo 0 .73
Placebo 1 .57
Placebo 2 0.56
Placebo 3 0.54
Placebo 4 0.52
Placebo 5 0.54
Placebo 6 0.56
Placebo 7 0.57
Placebo 8 0.52
Tripolidine 0 0.62
Tripolidine 1 0.57
Tripolidine 2 0.59
Tripolidine 3 0.54
Tripolidine 4 0.59
Tripolidine 5 0.58
Tripolidine 6 0.62
Tripolidine 7 0.57
Tripolidine 8 0.58
pseudoephedrine 0 0.68
pseudoephedrine 1 0.44
pseudoephedrine 2 0.40
pseudoephedrine 3 0.41
pseudoephedrine 4 0.34
pseudoephedrine 5 0.37
pseudoephedrine 6 0.37
pseudoephedrine 7 0.33
pseudoephedrine 8 0.36
Tripo_pseudo 0 0.68
Tripo_pseudo 1 0.50
Tripo_pseudo 2 0.47
Tripo_pseudo 3 0.45
Tripo_pseudo 4 0.44
Tripo_pseudo 5 0.46
Tripo_pseudo 6 0.43
Tripo_pseudo 7 0.42
Tripo_pseudo 8 0.45
;
run;
proc sgplot data=NAR;
title 'Separate Fit by Sex';
styleattrs datasymbols=(circlefilled squarefilled diamondfilled trianglefilled)
datalinepatterns=(solid);
lineparm y=Meanlog_NAR x=Time /Group=Drug lineattrs=(thickness=2)
nomissinggroup;
xaxis min=10;
run;
The longest drug name in your data set is 15 characters long, so I added a length statement to the data step. A SERIES plot with REFLINEs gets pretty close to the graphic you asked for.
I'm using SAS University Edition. I couldn't get the subscript 2 to display properly in the y axis label. There's no option on the KEYLEGEND statement to split the really long drug name. You might be able to do that if you use annotation instead.
data NAR;
length drug $ 15;
input Drug $ Time Meanlog_NAR;
cards;
Placebo 0 .73
Placebo 1 .57
Placebo 2 0.56
Placebo 3 0.54
Placebo 4 0.52
Placebo 5 0.54
Placebo 6 0.56
Placebo 7 0.57
Placebo 8 0.52
Tripolidine 0 0.62
Tripolidine 1 0.57
Tripolidine 2 0.59
Tripolidine 3 0.54
Tripolidine 4 0.59
Tripolidine 5 0.58
Tripolidine 6 0.62
Tripolidine 7 0.57
Tripolidine 8 0.58
pseudoephedrine 0 0.68
pseudoephedrine 1 0.44
pseudoephedrine 2 0.40
pseudoephedrine 3 0.41
pseudoephedrine 4 0.34
pseudoephedrine 5 0.37
pseudoephedrine 6 0.37
pseudoephedrine 7 0.33
pseudoephedrine 8 0.36
Tripo_pseudo 0 0.68
Tripo_pseudo 1 0.50
Tripo_pseudo 2 0.47
Tripo_pseudo 3 0.45
Tripo_pseudo 4 0.44
Tripo_pseudo 5 0.46
Tripo_pseudo 6 0.43
Tripo_pseudo 7 0.42
Tripo_pseudo 8 0.45
;
run;
proc format;
value $drugtype
'Placebo'='Placebo '
'Tripolidine'='Tripolidine HCL '
'pseudoephedrine'='Pseudoephedrine HCL '
'Tripo_pseudo'='Tripolidine HCL+ Pseudoephedrine HCL'
;
run;
ods graphics / attrpriority=none width=8in noborder;
ods escapechar='^';
ODS RTF FILE='/folders/myfolders/ODS Graphics/drug plot.rtf';
proc sgplot data=NAR noborder nowall;
title 'Separate Fit by Sex';
styleattrs datasymbols=(diamondfilled squarefilled trianglefilled circlefilled)
datalinepatterns=(solid);
refline 0 3 6 / axis=x
label=('First Dose' 'Second Dose' 'Third Dose')
splitchar=' '
lineattrs=(pattern=shortdash);
series x=time y=meanlog_NAR / group=drug lineattrs=(thickness=2) nomissinggroup markers;
format drug $drugtype. ;
xaxis type=discrete label="Time (hours)";
yaxis min=0.2 max=0.8 label="Mean Log NAR (cm H ^{unicode '2082'x} O / L / sec)";
keylegend / title='' position=right noborder;
run;
ODS RTF CLOSE;
I have been trying to reproduce the attached graph using the following data but I have not been able to find an example that fits it perfectly. I need help urgently I have been on it for over a week and am at my wits end.
data NAR;
input Drug$ Time Meanlog_NAR @@;
cards;
Placebo 0 .73
Placebo 1 .57
Placebo 2 0.56
Placebo 3 0.54
Placebo 4 0.52
Placebo 5 0.54
Placebo 6 0.56
Placebo 7 0.57
Placebo 8 0.52
Tripolidine 0 0.62
Tripolidine 1 0.57
Tripolidine 2 0.59
Tripolidine 3 0.54
Tripolidine 4 0.59
Tripolidine 5 0.58
Tripolidine 6 0.62
Tripolidine 7 0.57
Tripolidine 8 0.58
pseudoephedrine 0 0.68
pseudoephedrine 1 0.44
pseudoephedrine 2 0.40
pseudoephedrine 3 0.41
pseudoephedrine 4 0.34
pseudoephedrine 5 0.37
pseudoephedrine 6 0.37
pseudoephedrine 7 0.33
pseudoephedrine 8 0.36
Tripo_pseudo 0 0.68
Tripo_pseudo 1 0.50
Tripo_pseudo 2 0.47
Tripo_pseudo 3 0.45
Tripo_pseudo 4 0.44
Tripo_pseudo 5 0.46
Tripo_pseudo 6 0.43
Tripo_pseudo 7 0.42
Tripo_pseudo 8 0.45
;
run;
proc sgplot data=NAR;
title 'Separate Fit by Sex';
styleattrs datasymbols=(circlefilled squarefilled diamondfilled trianglefilled)
datalinepatterns=(solid);
lineparm y=Meanlog_NAR x=Time /Group=Drug lineattrs=(thickness=2)
nomissinggroup;
xaxis min=10;
run;
There are two graphs. Which did you want?
Use a series statement to get the lines
Use scatter statement to get the points.
Use REF to get the reference lines.
Here is @SuzanneDorinski's code again with newer options and ODS statements commented out. Try it again
data NAR;
length drug $ 15;
input Drug $ Time Meanlog_NAR;
cards;
Placebo 0 .73
Placebo 1 .57
Placebo 2 0.56
Placebo 3 0.54
Placebo 4 0.52
Placebo 5 0.54
Placebo 6 0.56
Placebo 7 0.57
Placebo 8 0.52
Tripolidine 0 0.62
Tripolidine 1 0.57
Tripolidine 2 0.59
Tripolidine 3 0.54
Tripolidine 4 0.59
Tripolidine 5 0.58
Tripolidine 6 0.62
Tripolidine 7 0.57
Tripolidine 8 0.58
pseudoephedrine 0 0.68
pseudoephedrine 1 0.44
pseudoephedrine 2 0.40
pseudoephedrine 3 0.41
pseudoephedrine 4 0.34
pseudoephedrine 5 0.37
pseudoephedrine 6 0.37
pseudoephedrine 7 0.33
pseudoephedrine 8 0.36
Tripo_pseudo 0 0.68
Tripo_pseudo 1 0.50
Tripo_pseudo 2 0.47
Tripo_pseudo 3 0.45
Tripo_pseudo 4 0.44
Tripo_pseudo 5 0.46
Tripo_pseudo 6 0.43
Tripo_pseudo 7 0.42
Tripo_pseudo 8 0.45
;
run;
proc format;
value $drugtype
'Placebo'='Placebo '
'Tripolidine'='Tripolidine HCL '
'pseudoephedrine'='Pseudoephedrine HCL '
'Tripo_pseudo'='Tripolidine HCL+ Pseudoephedrine HCL'
;
run;
ods graphics / /*attrpriority=none*/ width=8in noborder;
ods escapechar='^';
*ODS RTF FILE='/folders/myfolders/ODS Graphics/drug plot.rtf';
data map;
id="one"; linepattern = "solid";
value ='Placebo '; markersymbol="diamondfilled "; output;
value ='Tripolidine HCL '; markersymbol="squarefilled "; output;
value ='Pseudoephedrine HCL '; markersymbol="trianglefilled"; output;
value ='Tripolidine HCL+ Pseudoephedrine HCL'; markersymbol="circlefilled "; output;
run;
proc sgplot data=NAR noborder dattrmap=map /*nowall*/;
title;
*styleattrs datasymbols=(diamondfilled squarefilled trianglefilled circlefilled)
datalinepatterns=(solid);
refline 0 3 6 / axis=x
label=('First Dose' 'Second Dose' 'Third Dose')
splitchar=' '
lineattrs=(pattern=shortdash);
series x=time y=meanlog_NAR / group=drug lineattrs=(thickness=2)
nomissinggroup markers markerattrs=(size=10) attrid=one;
format drug $drugtype. ;
xaxis type=discrete label="Time (hours)";
yaxis min=0.2 max=0.8 label="Mean Log NAR (cm H ^{unicode '2082'x} O / L / sec)";
keylegend / title='' position=right noborder;
run;
*ODS RTF CLOSE;
The longest drug name in your data set is 15 characters long, so I added a length statement to the data step. A SERIES plot with REFLINEs gets pretty close to the graphic you asked for.
I'm using SAS University Edition. I couldn't get the subscript 2 to display properly in the y axis label. There's no option on the KEYLEGEND statement to split the really long drug name. You might be able to do that if you use annotation instead.
data NAR;
length drug $ 15;
input Drug $ Time Meanlog_NAR;
cards;
Placebo 0 .73
Placebo 1 .57
Placebo 2 0.56
Placebo 3 0.54
Placebo 4 0.52
Placebo 5 0.54
Placebo 6 0.56
Placebo 7 0.57
Placebo 8 0.52
Tripolidine 0 0.62
Tripolidine 1 0.57
Tripolidine 2 0.59
Tripolidine 3 0.54
Tripolidine 4 0.59
Tripolidine 5 0.58
Tripolidine 6 0.62
Tripolidine 7 0.57
Tripolidine 8 0.58
pseudoephedrine 0 0.68
pseudoephedrine 1 0.44
pseudoephedrine 2 0.40
pseudoephedrine 3 0.41
pseudoephedrine 4 0.34
pseudoephedrine 5 0.37
pseudoephedrine 6 0.37
pseudoephedrine 7 0.33
pseudoephedrine 8 0.36
Tripo_pseudo 0 0.68
Tripo_pseudo 1 0.50
Tripo_pseudo 2 0.47
Tripo_pseudo 3 0.45
Tripo_pseudo 4 0.44
Tripo_pseudo 5 0.46
Tripo_pseudo 6 0.43
Tripo_pseudo 7 0.42
Tripo_pseudo 8 0.45
;
run;
proc format;
value $drugtype
'Placebo'='Placebo '
'Tripolidine'='Tripolidine HCL '
'pseudoephedrine'='Pseudoephedrine HCL '
'Tripo_pseudo'='Tripolidine HCL+ Pseudoephedrine HCL'
;
run;
ods graphics / attrpriority=none width=8in noborder;
ods escapechar='^';
ODS RTF FILE='/folders/myfolders/ODS Graphics/drug plot.rtf';
proc sgplot data=NAR noborder nowall;
title 'Separate Fit by Sex';
styleattrs datasymbols=(diamondfilled squarefilled trianglefilled circlefilled)
datalinepatterns=(solid);
refline 0 3 6 / axis=x
label=('First Dose' 'Second Dose' 'Third Dose')
splitchar=' '
lineattrs=(pattern=shortdash);
series x=time y=meanlog_NAR / group=drug lineattrs=(thickness=2) nomissinggroup markers;
format drug $drugtype. ;
xaxis type=discrete label="Time (hours)";
yaxis min=0.2 max=0.8 label="Mean Log NAR (cm H ^{unicode '2082'x} O / L / sec)";
keylegend / title='' position=right noborder;
run;
ODS RTF CLOSE;
You need to update the code - at minimum at least the path where she's saving the file.
The location of the error makes me suspect that you may have an error before this procedure, not with the actual code.
What version of SAS do you have and what interface are you working with, ie SAS Studio, Base SAS, SAS EG?
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.
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.