BookmarkSubscribeRSS Feed
RoyPardee
Obsidian | Level 7

Hey All,

 

I love the plot I get with the below code, except that I would like to have the different marker symbols appear on the lines in the legend--like this:

 

legend_want.PNG

 

(I get that if I specify a SERIES plot with the /MARKERS option.)

 

Instead, I just get the colored lines w/no symbols.  In the fake data I give below it's not a big deal, but my real graph has 12 different groups.

 

I've played around with the KEYLEGEND statement, but have not figured out a way to add those symbols.

 

Can it be done?

 

I'm using 9.4 (TS1M4) on X64_7PRO.

 

Many thanks!

 

-Roy

 

data gnu ;
  input
    @1    clinic   $char5.
    @9    mo       date9.
    @21   metric   3.0
  ;
  format mo mmddyy10. ;
datalines ;
north   01jan2002   344
north   01feb2002   400
north   01mar2002   300
north   01apr2002   423
north   01may2002   600
north   01jun2002   603
south   01jan2002   356
south   01feb2002   412
south   01mar2002   500
south   01apr2002   489
south   01may2002   200
south   01jun2002   193
run ;

options orientation = landscape ;
* ods graphics / height = 8in width = 10in ;

ods html
  path  = "c:\deleteme" (URL=NONE)
  body  = "deleteme.html"
  style = magnify
  nogfootnote
;

  proc sgplot data = gnu ;
    * series  x = mo y = metric / group = clinic lineattrs=(pattern = solid) markers ;
    loess  x = mo y = metric / group = clinic lineattrs=(pattern = solid) ;
  run ;

ods html close ;

The plot that gets me is:

SGPlot1.png

3 REPLIES 3
BrunoMueller
SAS Super FREQ

It can be done, but you need SAS9.4M5 using LEGENDITEM statement. 

 

See example below

ods graphics / attrpriority=none;

proc sgplot data = gnu  ;
  styleattrs
    datacolors=(green blue)
      DATACONTRASTCOLORS=(green blue)
      datasymbols=(square triangle)
      datalinepatterns=(solid solid)

;
  scatter  x = mo y = metric / group = clinic name="scatter";
  loess  x = mo y = metric / group = clinic nomarkers  name="loess";
  legenditem type=markerline name="g1" / 
    label="north"
    markerattrs=(color=green symbol=square)
    lineattrs=(color=green)
  ;
  legenditem type=markerline name="g2" / 
    label="south"
    markerattrs=(color=blue symbol=triangle)
    lineattrs=(color=blue)
  ;
  keylegend 
    "scatter" "loess"
    "g1" "g2"
  ;
run;

you can also use ODS TRACE ON; to see which output objects are created, then use ODS OUTPUT objName=datasetName; to get the data and then use other statements to plot what you want.

 

see this blog entry https://blogs.sas.com/content/graphicallyspeaking/2018/01/09/need-know-graph-template-data-object-pr... by @WarrenKuhfeld for details

RoyPardee
Obsidian | Level 7

Thanks much for the reply!  Alas, that does not work for me--sas does not recognize the legenditem statement, no doubt b/c I'm not on the version you specified.

 

Also--yikes--that's a lot of code.

 

Maybe I should add it to the SAS Ballot as a requested enhancement...

BrunoMueller
SAS Super FREQ

Try this GTL code, should work with your version of SAS.

 

You be the judge on the length of the code 😉

 


ods path
  (prepend) work.myTemplates (update)
;
ods graphics / attrpriority=none;
proc template;
  define statgraph sgplot;
    begingraph / collation=binary subpixel=on dataColors=( CX008000 CX0000FF ) dataContrastColors=( CX008000 CX0000FF ) dataSymbols=( SQUARE TRIANGLE ) dataLinePatterns=( 1 1 );
      LegendItem TYPE=MARKERLINE NAME="g1" / Lineattrs=( Color=CX008000) Markerattrs=( Color=CX008000 Symbol=SQUARE) LABEL="north";
      LegendItem TYPE=MARKERLINE NAME="g2" / Lineattrs=( Color=CX0000FF) Markerattrs=( Color=CX0000FF Symbol=TRIANGLE) LABEL="south";
      layout overlay / yaxisopts=(labelFitPolicy=Split) y2axisopts=(labelFitPolicy=Split);
        ScatterPlot X=mo Y=metric / subpixel=off primary=true Group=clinic LegendLabel="metric" NAME="scatter";
        LoessPlot X=mo Y=metric / NAME="loess" LegendLabel="Loess" Group=eval(sort(clinic, RETAIN=ALL));
        DiscreteLegend "scatter" "loess" "g1" "g2" / Location=Outside;
      endlayout;
    endgraph;
  end;
run;

proc sgrender data=gnu template=sgplot;
run;

 

 

SAS Innovate 2025: Register Now

Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
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
  • 3 replies
  • 1686 views
  • 2 likes
  • 2 in conversation