BookmarkSubscribeRSS Feed
☑ This topic is solved. Need further help from the community? Please sign in and ask a new question.
hellohere
Pyrite | Level 9

Here is y2axis to to 2 Y. ANYWAY to 3 Y-axis with any PROC in SINGLE plot? Thanks,

 

Here is a post on this, but quite out-of-date, The more the merrier - Graphically Speaking

Anyway new and convenient?!

1 ACCEPTED SOLUTION

Accepted Solutions
Ksharp
Super User

You can not get job done  by the url you mentioned ? and why ?

https://blogs.sas.com/content/graphicallyspeaking/2012/01/16/the-more-the-merrier/

 

 

You want this ?




data have;
do i=1 to 100;
	x1=sin(i/10)+5;x2=cos(i/10);
	dif=x1-x2; output;
end;
run;




proc sql noprint;
select min(x1),max(x1) into :min_x1,:max_x1 from have;
select min(x2),max(x2) into :min_x2,:max_x2 from have;

select floor(min(x1)),ceil(max(x1)) into :min_y,:max_y from have;
quit;
/*specify the Y axis tick value*/
data axis;
do x1=&min_y to &max_y by 0.5;
 label_x1=x1;
 label_x2=&min_x2 +  (&max_x2-&min_x2) * (x1-&min_x1)/(&max_x1-&min_x1);
 output;
end;
  format label_x1 label_x2 10.2;
run;
proc sort data=have;by x1;run;
data want;
 merge have axis;
 by x1;
 _x2=&min_x1+ (&max_x1-&min_x1)* (x2-&min_x2)/(&max_x2-&min_x2) ;
run;
proc sort data=want;by i;run;
options missing=' ';
proc sgplot data=want;
series x=i y=x1/lineattrs=(color=red);
series x=i y=_x2/lineattrs=(color=blue);
series x=i y=dif/lineattrs=(color=green) y2axis;

yaxis values=(&min_y to &max_y  by 0.5) display=(novalues nolabel)  ;

yaxistable  label_x1/label='x1' position=left labelattrs=(color=red size=10) valueattrs=(color=red size=10) ;
yaxistable  label_x2/label='_x2' position=left labelattrs=(color=blue size=10) valueattrs=(color=blue size=10);
y2axis labelpos=top labelattrs=(color=green size=10) valueattrs=(color=green size=10);
run;

Ksharp_0-1757940302144.png

 

 

View solution in original post

7 REPLIES 7
hellohere
Pyrite | Level 9

Simply to let x1 x2 and dif have own Y-axis.  Thanks 

 

data _temp;
do i=1 to 100;
	x1=sin(i/10)+5;x2=cos(i/10);
	dif=x1-x2; output;
end;
run;quit;

proc sgplot data=_temp;
series x=i y=x1;
series x=i y=x2;
series x=i y=dif/y2axis;
run;quit;
ballardw
Super User

Additional axis such as you propose would require you to rescale the data of the 3rd (or 4th or 5th) to one of the existing Y or Y2 axis and then basically draw the desired axis as a separate graphic element to have these graphs appear in a single panel using the SGPlot procedure.

 

If having the separate series appear in separate panels would be acceptable the Proc SGPanel with some data reshaping to add a variable for the Panelby statement with options Columns=1 and Uniscale=Column and  use a single Y variable might work.

Example:

data _temp;
do i=1 to 100;
	x1=sin(i/10)+5;
   x2=cos(i/10);
	dif=x1-x2; 
   output;
end;
run;

proc transpose data=_temp out=temp_trans (rename=(_name_=panel))
  prefix=y
;
  by i;
  var x1 x2 dif; 
run;

proc sgpanel data=temp_trans;
   panelby panel/columns=1 uniscale=column;
   series x=i y=y1;
   label panel='Y variable';

run;quit;

Which would be extendable to more y values.

 

Proc Transpose used here for a quick reshape of the data. 

 

 

Ksharp
Super User

You can not get job done  by the url you mentioned ? and why ?

https://blogs.sas.com/content/graphicallyspeaking/2012/01/16/the-more-the-merrier/

 

 

You want this ?




data have;
do i=1 to 100;
	x1=sin(i/10)+5;x2=cos(i/10);
	dif=x1-x2; output;
end;
run;




proc sql noprint;
select min(x1),max(x1) into :min_x1,:max_x1 from have;
select min(x2),max(x2) into :min_x2,:max_x2 from have;

select floor(min(x1)),ceil(max(x1)) into :min_y,:max_y from have;
quit;
/*specify the Y axis tick value*/
data axis;
do x1=&min_y to &max_y by 0.5;
 label_x1=x1;
 label_x2=&min_x2 +  (&max_x2-&min_x2) * (x1-&min_x1)/(&max_x1-&min_x1);
 output;
end;
  format label_x1 label_x2 10.2;
run;
proc sort data=have;by x1;run;
data want;
 merge have axis;
 by x1;
 _x2=&min_x1+ (&max_x1-&min_x1)* (x2-&min_x2)/(&max_x2-&min_x2) ;
run;
proc sort data=want;by i;run;
options missing=' ';
proc sgplot data=want;
series x=i y=x1/lineattrs=(color=red);
series x=i y=_x2/lineattrs=(color=blue);
series x=i y=dif/lineattrs=(color=green) y2axis;

yaxis values=(&min_y to &max_y  by 0.5) display=(novalues nolabel)  ;

yaxistable  label_x1/label='x1' position=left labelattrs=(color=red size=10) valueattrs=(color=red size=10) ;
yaxistable  label_x2/label='_x2' position=left labelattrs=(color=blue size=10) valueattrs=(color=blue size=10);
y2axis labelpos=top labelattrs=(color=green size=10) valueattrs=(color=green size=10);
run;

Ksharp_0-1757940302144.png

 

 

hellohere
Pyrite | Level 9

Many Thanks. This is what I need. 

 

"Label_x1 Label_x2" takes too much spade. SO I switch to "_x1 _x2".

 

But somehow _x2 comes with mess. 

 

 

data have;
do i=1 to 100;
	x1=sin(i/10)+5;x2=cos(i/10);
	dif=x1-x2; output;
end;
run;

proc sql noprint;
select min(x1),max(x1) into :min_x1,:max_x1 from have;
select min(x2),max(x2) into :min_x2,:max_x2 from have;

select floor(min(x1)),ceil(max(x1)) into :min_y,:max_y from have;
quit;
/*specify the Y axis tick value*/
data axis;
do x1=&min_y to &max_y by 1.0;
 _x1=x1;
 _x2=&min_x2 +  (&max_x2-&min_x2) * (x1-&min_x1)/(&max_x1-&min_x1);
 output;
end;
format _x1 _x2 10.1;
run;
proc sort data=have;by x1;run;
data want;
 merge have axis;
 by x1;
 _x2=&min_x1+ (&max_x1-&min_x1)* (x2-&min_x2)/(&max_x2-&min_x2) ;
 format _x2 10.1;
run;
proc sort data=want;by i;run;
options missing=' ';
proc sgplot data=want;
series x=i y=x1/lineattrs=(color=red);
series x=i y=_x2/lineattrs=(color=blue);
series x=i y=dif/lineattrs=(color=green) y2axis;

yaxis values=(&min_y to &max_y  by 1) display=(novalues nolabel)  ;

yaxistable  _x1/position=left labelattrs=(color=red size=10) valueattrs=(color=red size=10) ;
yaxistable  _x2/position=left labelattrs=(color=blue size=10) valueattrs=(color=blue size=10);
y2axis labelpos=top labelattrs=(color=green size=10) valueattrs=(color=green size=10);
run;

plot.png

hellohere
Pyrite | Level 9

I use SQL to stitch. It comes up clean now. 

Ksharp
Super User

Notice I changed the code. 

You are using my old code .

Did you try my updated code ?

data have;
do i=1 to 100;
	x1=sin(i/10)+5;x2=cos(i/10);
	dif=x1-x2; output;
end;
run;

proc sql noprint;
select min(x1),max(x1) into :min_x1,:max_x1 from have;
select min(x2),max(x2) into :min_x2,:max_x2 from have;

select floor(min(x1)),ceil(max(x1)) into :min_y,:max_y from have;
quit;
/*specify the Y axis tick value*/
data axis;
do x1=&min_y to &max_y by 0.5 ;
 label_x1=x1;
 label_x2=&min_x2 +  (&max_x2-&min_x2) * (x1-&min_x1)/(&max_x1-&min_x1);
 output;
end;
format label_x1 label_x2 10.1;
run;
proc sort data=have;by x1;run;
data want;
 merge have axis;
 by x1;
 _x2=&min_x1+ (&max_x1-&min_x1)* (x2-&min_x2)/(&max_x2-&min_x2) ;
 format _x2 10.1;
run;
proc sort data=want;by i;run;
options missing=' ';
proc sgplot data=want;
series x=i y=x1/lineattrs=(color=red);
series x=i y=_x2/lineattrs=(color=blue);
series x=i y=dif/lineattrs=(color=green) y2axis;

yaxis values=(&min_y to &max_y  by 0.5) display=(novalues nolabel)  ;

yaxistable  label_x1/label='x1' position=left labelattrs=(color=red size=10) valueattrs=(color=red size=10) ;
yaxistable  label_x2/label='_x2' position=left labelattrs=(color=blue size=10) valueattrs=(color=blue size=10);
y2axis labelpos=top labelattrs=(color=green size=10) valueattrs=(color=green size=10);
run;

Ksharp_0-1757941810298.png

 

 

hellohere
Pyrite | Level 9

OK NOW. Thanks. 

 

 

P2.png

hackathon24-white-horiz.png

2025 SAS Hackathon: There is still time!

Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!

Register Now

How to Concatenate Values

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 7 replies
  • 425 views
  • 2 likes
  • 3 in conversation