Hello,
I have a dataset like this:
01NOV2017, -0.3
01OCT2017, -0.5
01SEP2017, -0.2
01AUG2017, 0.4
01JUL2017, 0.5
01JUN2017, 0.6
01MAY2017, 0.5
01APR2017, 0.3
01MAR2017, 0.6
01FEB2017, 0.2
01JAN2017, 0.5
01DEC2016, 0.4
01NOV2016, 0.2
01OCT2016, 0.5
01SEP2016, 0.6
01AUG2016, 0.5
01JUL2016, 0.4
01JUN2016, 0.6
When I graph it in proc sgplot (output to rtf), I want every value to appear on the x-axis (each and every month). I tried the x-axis option "interval= month", but that had no effect. So I started using the x-axis option "type= discrete", and that works.
But I also want the date values to be formatted in the graphing step (so that I don't have to include an additional data step - since I may have to do a number graphs): 01NOV2016 --> Nov-16, for example. The x-axis option "valuesformat = MONYY." mostly accomplishes this, but it is not compatible with type= discrete. I tried "tickvalueformat= MONYY" but that had no effect at all.
Any way to get these both to work?
I'm really new to graphing in SAS, so I'm probably missing some really basic knowledge. Would appreciate if someone could correct me!
Thanks!
Code?
@sm4 wrote:
Hello,
I have a dataset like this:
01NOV2017, -0.3
01OCT2017, -0.5
01SEP2017, -0.2
01AUG2017, 0.4
01JUL2017, 0.5
01JUN2017, 0.6
01MAY2017, 0.5
01APR2017, 0.3
01MAR2017, 0.6
01FEB2017, 0.2
01JAN2017, 0.5
01DEC2016, 0.4
01NOV2016, 0.2
01OCT2016, 0.5
01SEP2016, 0.6
01AUG2016, 0.5
01JUL2016, 0.4
01JUN2016, 0.6When I graph it in proc sgplot (output to rtf), I want every value to appear on the x-axis (each and every month). I tried the x-axis option "interval= month", but that had no effect. So I started using the x-axis option "type= discrete", and that works.
But I also want the date values to be formatted in the graphing step (so that I don't have to include an additional data step - since I may have to do a number graphs): 01NOV2016 --> Nov-16, for example. The x-axis option "valuesformat = MONYY." mostly accomplishes this, but it is not compatible with type= discrete. I tried "tickvalueformat= MONYY" but that had no effect at all.
Any way to get these both to work?
I'm really new to graphing in SAS, so I'm probably missing some really basic knowledge. Would appreciate if someone could correct me!
Thanks!
proc sgplot data= test noborder nowall; series x= month y= SA / name= "SA" legendlabel= 'test' markers lineattrs= (color= darkblue thickness = 2) markerattrs= (symbol= diamondfilled color= darkblue); series x= month y= UA / name= "UA" legendlabel= 'test' lineattrs= (color= red thickness = 2); title1 font= albany height= 11pt bold justify= right 'test'; title2 font=albany height= 10pt 'test'; title3 ' '; xaxis display=(nolabel) type= discrete tickvalueformat= MONYY. /*valuesformat= MONYY.*/ interval= month labelattrs= (family= albany size= 10px weight=bold); yaxis label= 'test' labelattrs= (family= albany weight= bold) valueattrs= (family= albany weight= bold) values= (-0.025 to 0.025 by 0.005) valuesformat= PERCENTN10.1; band x= month upper= 0 lower= -0.03 / fillattrs= (color= antiquewhite) transparency= 0.5; keylegend "SA" "UA"/ location= inside position= top valueattrs= (family= albany weight=bold) noborder; run;
I tried putting my dataset through datalines but was having formatting issues so finally gave up.
Thank you!
What about the following options together:
type=date
interval=month
valuesformat=monyy7.
values = (start to end by interval)
Demo here, but read your log carefully. If you have too many tick values it won't print them and you have to adjust them to fit etc. but this gets one per month and formatted as stated.
SAS 9.4TS1M5
proc sgplot data=sashelp.stocks;
where stock='IBM' and year(date) = 2000 ;
series x=date y=open / markers;
xaxis interval=month valuesformat=monyy7.
type=time
values=('01Jan2000'd to '31Dec2000'd by 1);
run;
@sm4 wrote:
proc sgplot data= test noborder nowall; series x= month y= SA / name= "SA" legendlabel= 'test' markers lineattrs= (color= darkblue thickness = 2) markerattrs= (symbol= diamondfilled color= darkblue); series x= month y= UA / name= "UA" legendlabel= 'test' lineattrs= (color= red thickness = 2); title1 font= albany height= 11pt bold justify= right 'test'; title2 font=albany height= 10pt 'test'; title3 ' '; xaxis display=(nolabel) type= discrete tickvalueformat= MONYY. /*valuesformat= MONYY.*/ interval= month labelattrs= (family= albany size= 10px weight=bold); yaxis label= 'test' labelattrs= (family= albany weight= bold) valueattrs= (family= albany weight= bold) values= (-0.025 to 0.025 by 0.005) valuesformat= PERCENTN10.1; band x= month upper= 0 lower= -0.03 / fillattrs= (color= antiquewhite) transparency= 0.5; keylegend "SA" "UA"/ location= inside position= top valueattrs= (family= albany weight=bold) noborder; run;
I tried putting my dataset through datalines but was having formatting issues so finally gave up.
Thank you!
Thank you!!
Tried that out, and it looks like it's getting closer to working because now only a couple of months are left off. I figured this has to do with the fact that it persistently will not rotate the tick values and by default 'thins' them for time-type axes, so I tried adding a 'FITPOLICY= ROTATE' in the xaxis statement. It gives this log note:
NOTE: TICKVALUEFITPOLICY=Rotate is ignored when SPLITTICKVALUE=TRUE. The default THIN policy is used. NOTE: Some of the tick values have been thinned.
When I googled the SPLITTICKVALUE option to change it to FALSE, it only brought up GTL/layout overlay references. So I tried adding this to my original proc template:
define statgraph series; begingraph; layout overlay/ xaxisopts=(type= time timeopts=(tickvalueformat= monyy7. splittickvalue= false)); endlayout; endgraph; end;
The template was defined successfully, but I could not find how to reference it in the proc sgplot code. The 'template=' did not turn blue in EG either in the first statement or in the body of proc sgplot:
proc sgplot data= test noborder nowall template= series;
It looks like all I need to do to get this to work is to switch SPLITTICKVALUE to FALSE. Any idea on how to do this?
Thanks a million for your help! Because of you and others on this site, I'm able to do things in SAS that I knew zero about just a couple of days ago.
Thanks!! This worked perfectly - with one main modification, which I'll put here for others:
When I simply tried adding 'notimesplit' to the xaxis statement, I got a crazy result, where the x-axis was covered in what looked like inkblots. Then I decided to remove the 'values=' statement suggested by Reeza, b/c I figured that was the one most likely to be causing the problem. Then everything worked perfectly. Here is the solution code:
proc sgplot data= test noborder nowall; series x= month y= SA / name= "SA" legendlabel= 'test' markers lineattrs= (color= darkblue thickness = 2) markerattrs= (symbol= diamondfilled color= darkblue); series x= month y= UA / name= "UA" legendlabel= 'test' lineattrs= (color= red thickness = 2); title1 font= albany height= 11pt bold justify= right 'test'; title2 font=albany height= 10pt 'test'; title3 ' '; xaxis display=(nolabel) type= time notimesplit fitpolicy= rotate valuesformat= MONYY5. interval= month labelattrs= (family= albany size= 10px weight=bold); yaxis label= 'test' labelattrs= (family= albany weight= bold) valueattrs= (family= albany weight= bold) values= (-0.025 to 0.025 by 0.005) valuesformat= PERCENTN10.1; band x= month upper= 0 lower= -0.03 / fillattrs= (color= antiquewhite) transparency= 0.5; keylegend "SA" "UA"/ location= inside position= top valueattrs= (family= albany weight=bold) noborder; run;
the only catch is, I was using this for batch mode SAS via Unix. When I tried to use the same for another set of data in Base SAS (9.4), it doesn't really work (the x-axis options, I mean). The tick values don't line up with the data points, though they were lining up before. Anyway - that's a problem for another time.
Thank you!!!
SAS is headed back to Vegas for an AI and analytics experience like no other! Whether you're an executive, manager, end user or SAS partner, SAS Innovate is designed for everyone on your team.
Interested in speaking? Content from our attendees is one of the reasons that makes SAS Innovate such a special event!
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.