Data visualization with SAS programming

User-defined Formats in PROC SGPLOT, cannot use discrete axis

Accepted Solution Solved
Reply
Contributor sm4
Contributor
Posts: 48
Accepted Solution

User-defined Formats in PROC SGPLOT, cannot use discrete axis

Hello,

 

I guess I'm hoping there's someone who might know of some updated solution/workaround to the already-documented issue of user-defined picture formats not rendering in proc sgplot.

 

I am using picture formats to generate a Mon-YY format with a dash, courtesy of another kind user: https://communities.sas.com/t5/General-SAS-Programming/MONTH-YY-and-MON-YY-date-format/m-p/446015/hi...

 

Realized after accepting the solution that they won't render in proc sgplot. Like the user in the first link above, I can't format the dataset outside and then plot that discretely (as suggested) because I'm using a slightly tricky time axis, was difficult enough to get it to do what I want without introducing the formatting issue:

		xaxis display=(nolabel) type= time notimesplit fitpolicy= rotate interval= semiyear values= ('01JAN2000'd to &today. by semiyear)  valuesformat= MONYY5.;



Currently I'm using MONYY5., but I would like to get Mon-YY if possible.

Would appreciate any insight if anyone has any.

Thanks!


Accepted Solutions
Solution
‎03-29-2018 01:16 PM
Contributor
Posts: 72

Re: User-defined Formats in PROC SGPLOT, cannot use discrete axis

Please try like below, 

 

I have created small example data. 

 

 

data simple ;
do x= '01jan2018'd to '31dec2018'd by 30;
y+1;
output;
end;
run;

data fmt;
set simple;
start=x;
label=strip(substr(put(start,monyy5.),1,3))||'-'||strip(put(year(x),best.));
fmtname='chkfmt';
run;

proc format cntlin=fmt;
run;

proc sgplot data=simple;
scatter x=x y=y ;
xaxis label=' SAS defined format' ;
format x monyy7. ;
run;


proc sgplot data=simple;
scatter x=x y=y ;
xaxis label=' User defined format' values=('01jan2018'd to '31dec2018'd by 30);
format x chkfmt. ;
run;

View solution in original post


All Replies
Super User
Posts: 22,823

Re: User-defined Formats in PROC SGPLOT, cannot use discrete axis

What version of SAS are you using?

Proc product_status;run;
Contributor sm4
Contributor
Posts: 48

Re: User-defined Formats in PROC SGPLOT, cannot use discrete axis

9.4

 

Thanks!

SAS Super FREQ
Posts: 1,042

Re: User-defined Formats in PROC SGPLOT, cannot use discrete axis

What you could do is use a small data step to create a column of formatted month values. Then, use that dataset with SGPLOT, referencing that formatted variable for your category values.

 

Hope this helps!

Dan

Contributor sm4
Contributor
Posts: 48

Re: User-defined Formats in PROC SGPLOT, cannot use discrete axis

Thanks for your response! 

I think this might be the same issue where if I format it beforehand, I won't be able to plot it on the time type x-axis since it won't be a sasdate anymore?

Super User
Posts: 13,008

Re: User-defined Formats in PROC SGPLOT, cannot use discrete axis

[ Edited ]

Some example data and your current sgplot code might go a ways towards a solution. Especially if you can describe what is wrong with axis appearance.

 

I don't think I would consider that a "tricky" axis though.

Contributor sm4
Contributor
Posts: 48

Re: User-defined Formats in PROC SGPLOT, cannot use discrete axis

Thanks for your response!
Yeah, I guess I meant "tricky" relative to other datasets that I easily changed to a discrete axis for. 

I am trying to automate in SAS a graph produced by my organization. I basically have a dataset with a value for every month since, say, Jan 2000 until Dec 2017. I want my x axis values to be every 6 months starting with a month I choose, e.g. Feb-01 Aug-01 Feb-02 Aug-02 etc, with a line marker for every month's observation, not just Feb and Aug.  I was able to establish this with the time type x-axis statement above after some trial and error (I am new to graphing in SAS hence it was tricky) but it doesn't give me the Mon-YY formatting I want. 

I can get the Mon-YY formatting I want if I drop all but Feb and Aug observations from my dataset, apply the user-defined format, and then plot discretely. But then I will lose the line-markers for non-Feb/Aug months.

It's not such a big deal, but since I'm trying to replicate exactly what the organization already does and since it seems like it should be doable, I want to see if I can get both Mon-YY formatting as well as markers for every month (mutually exclusive in my trials so far). But again, not a big deal if it's not possible.

Sample data would just be one record for every month from, say, Jan 2000 until Dec 2017, where month is formatted as date9 and value can be anything. I'm trying to be cautious about what I share or else I would put something here.

Thanks very much!

Contributor sm4
Contributor
Posts: 48

Re: User-defined Formats in PROC SGPLOT, cannot use discrete axis

Sorry, forgot to include my sgplot code:

      proc sgplot data= temp.figure noborder nowall pad=(left= 5pct right= 5pct) noautolegend;
           series x= month y= change/ lineattrs= (color= black thickness = 2) markers markerattrs= (symbol= diamondfilled color= darkblue);
           xaxis display=(nolabel) type= time notimesplit fitpolicy= rotate interval= semiyear values= ('01FEB2000'd to &today. by semiyear) valuesformat= MONYY5. valueattrs= (family= albany size= 12px weight=bold) offsetmin= 0 offsetmax= 0;
           yaxis label= 'Label' labelattrs= (family= albany weight= bold size= 9.5pt) valueattrs= (family= albany weight=bold) values= (-0.28 to 0.16 by 0.02) valuesformat= PERCENTN10.1;
           band x= month upper= 0.15 lower= -0.23 / fillattrs= (color= aliceblue) transparency= 0.5; 
           refline 0 / lineattrs=(color=LIGB);
      run;
Contributor
Posts: 72

Re: User-defined Formats in PROC SGPLOT, cannot use discrete axis

Hi,

 

Please try to use FORMAT statement in the proc sgplot. 

 

Ex: Format xaxisvariable MONYY5./predefined format created ;

 

Contributor sm4
Contributor
Posts: 48

Re: User-defined Formats in PROC SGPLOT, cannot use discrete axis

Posted in reply to DR_Majeti

Thanks for your response!

Tried this out (removing the valuesformat= option on the xaxis statement), it gives the same issue. The user-generated format doesn't load, showing only '0B-%0y'.

Solution
‎03-29-2018 01:16 PM
Contributor
Posts: 72

Re: User-defined Formats in PROC SGPLOT, cannot use discrete axis

Please try like below, 

 

I have created small example data. 

 

 

data simple ;
do x= '01jan2018'd to '31dec2018'd by 30;
y+1;
output;
end;
run;

data fmt;
set simple;
start=x;
label=strip(substr(put(start,monyy5.),1,3))||'-'||strip(put(year(x),best.));
fmtname='chkfmt';
run;

proc format cntlin=fmt;
run;

proc sgplot data=simple;
scatter x=x y=y ;
xaxis label=' SAS defined format' ;
format x monyy7. ;
run;


proc sgplot data=simple;
scatter x=x y=y ;
xaxis label=' User defined format' values=('01jan2018'd to '31dec2018'd by 30);
format x chkfmt. ;
run;

Super User
Posts: 22,823

Re: User-defined Formats in PROC SGPLOT, cannot use discrete axis

Posted in reply to DR_Majeti

@DR_Majeti is correct. A PICTURE format will not work, but using a 'normal' format seems to work. That's an important distinction and good to know, learn something new every day!

 

 

Contributor sm4
Contributor
Posts: 48

Re: User-defined Formats in PROC SGPLOT, cannot use discrete axis

Posted in reply to DR_Majeti

Am checking this out, will update here soon. Thank you!!

Contributor sm4
Contributor
Posts: 48

Re: User-defined Formats in PROC SGPLOT, cannot use discrete axis

Posted in reply to DR_Majeti

Worked! Cat Very Happy

Instead of using it through a separate format statement I used it with the "valuesformat=" option on the xaxis statement - the former caused my axis to change from semi-yearly to yearly, for some reason. Using it with valuesformat works perfectly.

Thank you very, very much.

Super User
Posts: 22,823

Re: User-defined Formats in PROC SGPLOT, cannot use discrete axis

Posted in reply to DR_Majeti

It is noted in the documentation that SAS custom formats do not work in GTL, so unfortunately the format you want isn't available. 

 

You're likely correct in that converting the date will not give you what you want, but I'd try it to verify anyways.

☑ This topic is solved.

Need further help from the community? Please ask a new question.

Discussion stats
  • 19 replies
  • 340 views
  • 10 likes
  • 7 in conversation