The

 ```data myanno; length function color \$8; function='move'; x=0; y=0; output; function='draw'; x=100; y=100; color='red'; output; run;   proc gplot data=sashelp.cars; plot mpg_highway*cylinders / vaxis=axis1 haxis=axis2 annotate=myanno; symbol1 interpol=none value=dot color=blue; axis1 label=(angle=90); axis2 offset=(2,2)pct; run; quit;```

The following annotate errors are written to the SAS log when I run this code:

```NOTE: ERROR DETECTED IN ANNOTATE= DATASET WORK.MYANNO. NOTE: PROBLEM IN OBSERVATION 2 - A CALCULATED COORDINATE LIES OUTSIDE THE VISIBLE AREA X A CALCULATED COORDINATE LIES OUTSIDE THE VISIBLE AREA Y```

Here is the resulting graph:

The annotated line is drawn outside the axis area. But why? I defined my X and Y coordinates for the MOVE and DRAW functions correctly, did I not?

 ```data myanno; length function color \$8; retain xsys ysys '1'; function='move'; x=0; y=0; output; function='draw'; x=100; y=100; color='red'; output; run;   proc gplot data=sashelp.cars; plot mpg_highway*cylinders / vaxis=axis1 haxis=axis2 annotate=myanno; symbol1 interpol=none value=dot color=blue; axis1 label=(angle=90); axis2 offset=(2,2)pct; run; quit;```

Here is the graph containing the correct line:

### Creating Multiple Graphs with an Annotate Data Set, BY-and-BY

The need to generate multiple graphs from one procedure using a BY statement is very common. However, using an Annotate data set with a BY statement can be a little tricky. Here are the general rules for using an Annotate data set with a SAS/GRAPH procedure that creates multiple graphs with a BY statement:

1. Make sure that the Annotate data set and the input data set for the procedure include the same BY variables. The BY variables must also be the same data type in both data sets.
2. Both the Annotate data set and the input data set must be sorted by the BY variables.
3. Include the ANNOTATE= (or ANNO=) option in the action statement of the SAS/GRAPH procedure.

The goal of the following program is to create two graphs using a BY statement in which the annotation is specific to each graph. The Annotate data set draws the maximum MPG_Highway value at the maximum point for each X value.

```/* Compute the maximum MPG_Highway values */ proc sort data=sashelp.cars(where=(origin in('USA' 'Europe'))) out=cars; by origin cylinders; run;   proc means data=cars noprint; by origin cylinders; var mpg_highway; output out=meansout max=max; run;   data myanno; length function color text \$8; retain xsys ysys '2' color 'black' position '2' size 1.5; set meansout;   function='label'; x=cylinders; y=max; text=strip(max); output; run;   proc gplot data=cars annotate=myanno; by origin; plot mpg_highway*cylinders / vaxis=axis1 haxis=axis2; symbol1 interpol=none value=dot color=blue; axis1 label=(angle=90); axis2 offset=(2,2)pct; run; quit;```

Here are the resulting graphs:

There are two issues here. First, there should be only one maximum value displayed for each X value. There are duplicate values of the annotated text on each graph. Second, the following messages are written to the SAS log:

```NOTE: ERROR DETECTED IN ANNOTATE= DATASET WORK.MYANNO. NOTE: PROBLEM IN OBSERVATION 1 - DATA SYSTEM REQUESTED, BUT VALUE IS NOT ON GRAPH 'Y' NOTE: PROBLEM IN OBSERVATION 5 - DATA SYSTEM REQUESTED, BUT VALUE IS NOT ON GRAPH 'X' NOTE: The above message was for the following BY group: Origin=USA```

These notes tell me that either the X or the Y coordinate in two of the observations in the Annotate data set do not exist on one of the graphs. This issue occurs because the Annotate coordinates for each of the BY values are different for each graph. The axis ranges are different on the two graphs. So, when all of the annotation, instead of the annotation for only each BY value, is drawn on each graph, some of the Annotate coordinates cannot be found on the graph.

Both of these issues occur because the ANNOTATE=Myanno option is in the PROC GPLOT statement instead of in the action (PLOT) statement. Moving the ANNOTATE=Myanno option to the PLOT statement generates the expected output:

```proc gplot data=cars; by origin; plot mpg_highway*cylinders / vaxis=axis1 haxis=axis2 annotate=myanno; symbol1 interpol=none value=dot color=blue; axis1 label=(angle=90); axis2 offset=(2,2)pct; run; quit;```

### Off the Grid

Another common issue with using an Annotate data set is when a coordinate in the Annotate data set lies outside the range of an axis on the graph. For example, I will chart the mean MPG_Highway values with the GCHART procedure and draw a symbol at the maximum value for each country of origin using an Annotate data set:

```proc sort data=sashelp.cars out=cars; by origin; run;   /* Compute the mean and the max */ proc means data=cars noprint; by origin; var mpg_highway; output out=meansout mean=mean max=max; run;   data myanno; length function color \$8 text \$14; retain xsys ysys '2' color 'red' position '2' size 2; set meansout;   function='symbol'; midpoint=origin; y=max; text='diamondfilled'; output; run;   proc gchart data=meansout; vbar origin / sumvar=mean annotate=myanno raxis=axis1; axis1 label=(angle=90); run; quit;```

When I run this program, the following graph is produced, excluding the annotated symbols:

The following annotate error messages are written to the SAS log:

```NOTE: ERROR DETECTED IN ANNOTATE= DATASET WORK.MYANNO. NOTE: PROBLEM IN OBSERVATION 1 - DATA SYSTEM REQUESTED, BUT VALUE IS NOT ON GRAPH 'RESPONSE' NOTE: PROBLEM IN OBSERVATION 2 - DATA SYSTEM REQUESTED, BUT VALUE IS NOT ON GRAPH 'RESPONSE' NOTE: PROBLEM IN OBSERVATION 3 - DATA SYSTEM REQUESTED, BUT VALUE IS NOT ON GRAPH 'RESPONSE'```

These messages tell me that multiple response values (Y coordinates) in the Annotate data set lie outside the range of the Y axis. The procedure does not automatically extend the Y-axis range to accommodate the annotation, so I need to do this by including the ORDER= option in the AXIS1 statement:

```proc gchart data=meansout; vbar origin / sumvar=mean annotate=myanno raxis=axis1; axis1 label=(angle=90) order=(0 to 70 by 10); run; quit;```

The correct graph is now generated:

Annotation is a useful tool that enables you to draw features on a graph that the graphics procedure might not have the capability to draw. Using an Annotate data set is easier once you understand what the SAS log messages are telling you and can take steps to avoid common issues. Don’t be afraid to dive in!

Happy drawing!

Common annotate pitfalls and how to avoid them was published on SAS Users.

There's big money in professional sports these days - we're talking billions of dollars! Do you know which teams are the most valuable? The graphs in this blog will show you... I recently saw a bar chart on dadaviz.com showing the world's most valuable sports teams. It was the right kind […]

The post The world's most valuable sports teams appeared first on The SAS Training Post.

If you haven’t tried them for your web applications and other graphics needs, you’ll want to read further!

Scalable Vector Graphics (SVG) output is vector graphics output you can display with most (if not all) modern web browsers. Because SVG graphic output is scalable, you can zoom in on the graphics output without losing resolution. Unlike bit-mapped images such as PNG or GIF output, they can be resized or transformed without compromising the clarity, eliminating the need to produce multiple versions of the same image! There are other advantages for using Scalable Vector Graphics like their ability to zoom in to view details, their smaller output file size and their usefulness for producing graphics for a range of display sizes and types.

### Which SAS products offer SVG graphics?

The SVG family of device drivers has shipped as part of the SAS/GRAPH product since the SAS 9.2 release. Note that you can only use these SVG device drivers with traditional SAS/GRAPH procedures such as PROC GPLOT and PROC GCHART.

Starting with SAS 9.3 version of the Base product, you can also create SVG output with the SAS SG procedures such as SGPLOT and SGPANEL as well as with graphics output created with ODS Graphics. In SAS 9.4, you can also use Scalable Vector Graphics to produce animations.

Typically, when you create SVG graphics, you will want to create the output in one of these ways:

• a standalone SVG file with a file extension of .svg
• an HTML output file using the ODS HTML statement
• an HTML5 output file in SAS 9.4

The output method you choose depends on your application. If you’re creating standalone SVG files, you can use that SVG file in some other document and make reference to it in another HTML page. For example, a common application for this would be creating logos in SVG that can be sized to any space. If you are using SAS 9.4, the HTML5 method is the best when creating an HTML document because the SVG can be embedded directly and there are no additional files to be moved.

In this blog post I’ll show you how to produce each one of these output types using the Base Product or SAS/GRAPH. I’ve also included a list of sample SAS/GRAPH animations that you can try.

### Creating Scalable Vector Graphics with Base SAS

In SAS 9.3 and SAS 9.4, you can specify Scalable Vector Graphics output by specifying the OUTPUTFMT=SVG option on the ODS Graphics statement before the procedure step, such as:

```ods graphics on / outputfmt=svg;
```

The examples in this sections use the sashelp.cars data set shipped with the SAS 9.3 and SAS 9.4 Base product to produce a bubble plot.

Stand-alone SVG file. The following sample code uses PROC SGPLOT to write a standalone SVG file with the name sastest.svg to the C:temp directory when running on the Windows operating system:

```    ods _all_ close;
ods listing gpath='c:temp';

ods graphics / reset=all outputfmt=svg imagename='sastest';

title1 'Plot of MPG City versus Horsepower';
proc sgplot data=sashelp.cars;
bubble x=horsepower y=mpg_city size=cylinders;
run;
```

HTML file. This code uses the same PROC SGPLOT code to write a SVG file along with a corresponding HTML file to C:temp when running on the Windows operating system:

```    ods _all_ close;
ods html path='c:temp' (url=none) file='svg.html';

ods graphics / outputfmt=svg;

title1 'Plot of MPG City versus Horsepower';
proc sgplot data=sashelp.cars;
bubble x=horsepower y=mpg_city size=cylinders;
run;

ods html close;
ods listing;
```

HTML 5 file. With SAS 9.4 only, you can use PROC SGPLOT with the ODS HTML5 statement to embed the SVG output in an HTML file. Note that with the code below, the SVG output is embedded inside the HTML output via the use of the svg_mode='inline' option on the ODS HTML5 statement.

```    ods _all_ close;
ods html5 path='c:temp' (url=none) file='svg.html'
options(svg_mode='inline');

ods graphics / outputfmt=svg;

title1 'Plot of MPG City versus Horsepower';
proc sgplot data=sashelp.cars;
bubble x=horsepower y=mpg_city size=cylinders;
run;

ods html5 close;
ods listing;
```

### Creating Scalable Vector Graphics with SAS/GRAPH

The examples in this sections use PROC GPLOT and the sashelp.class data set to produce a linear plot of weight versus height.

Stand-alone SVG file. Here is sample SAS code that uses PROC GPLOT to write a standalone SVG file with the name sastest.svg to the Temp directory on your C: drive when running on the Windows operating system:

```    ods _all_ close;
ods listing;

filename grafout 'c:tempsastest.svg';

goptions reset=all device=svg gsfname=grafout;

symbol1 i=none v=dot c=black h=1.5;
axis1 minor=none;
title1 'Plot of Weight versus Height';
proc gplot data=sashelp.class;
plot weight*height / haxis=axis1 vaxis=axis1;
run;
quit;
```

HTML file. Here’s how to write the same output to a SVG file along with a corresponding HTML file:

```    ods _all_ close;
ods html path='c:temp' (url=none) file='svg.html';

goptions reset=all device=svg;

symbol1 i=none v=dot c=black h=1.5;
axis1 minor=none;
title1 'Plot of Weight versus Height';
proc gplot data=sashelp.class;
plot weight*height / haxis=axis1 vaxis=axis1;
run;
quit;

ods html close;
ods listing;
```

HTML 5 file. With SAS 9.4 only, the following sample code uses PROC GPLOT together with the ODS HTML5 statement to embed the SVG output in the resulting HTML file. Note that with the code below, the SVG output is embedded inside the HTML output via the use of the svg_mode='inline' option on the ODS HTML5 statement.

```    ods _all_ close;
ods html5 path='c:temp' (url=none) file='svg.html'
options(svg_mode='inline');

goptions reset=all device=svg;

symbol1 i=none v=dot c=black h=1.5;
axis1 minor=none;
title1 'Plot of Weight versus Height';
proc gplot data=sashelp.class;
plot weight*height / haxis=axis1 vaxis=axis1;
run;
quit;

ods html5 close;
ods listing;
```

### Using Scalable Vector Graphics for animation in SAS/GRAPH

Beginning with SAS 9.4, you can create animated graphs for the web using the SVG device driver together with new options available on the OPTIONS statement. Here are links to sample programs on support.sas.com that demonstrate how to create animated graphs for the web using the SAS 9.4 SVG device driver:

As I was doing my taxes, I wondered where the government is spending my tax dollars. And being a SAS user, I decided to find out using a graph ... I did a few Google searches on "tax graphs" and found one on the CNN web site that I liked - it […]

In writing the second edition of SAS Programming in the Pharmaceutical Industry, I knew that I wanted to replace the device-driven SAS/GRAPH figures with the new ODS template-driven graphics procedures. The latest developments in SAS graphics involve the template-driven procedures and tools found in SAS ODS graphics (i.e., ODS Graphics […]

Here's an example that shows SAS is more than just a tool to create analytic graphics - it can also be used to create 'cute' infographics! :) An infographic that recently caught my eye had a fleet of airplanes stretching from overhead out to the horizon, along with some interesting […]

Have you ever wanted to visualize the IMDb's ratings for your favorite TV show? Here's how you can do that with SAS software! The Internet Movie Database (IMDb) has a huge amount of data about movies, TV shows, etc. One of the things they track is the user-ratings for individual […]

I'm sure that anyone in the world would do whatever they could to help find the missing Flight 370 ... and this is my attempt to do what I can. In my previous blog post, I showed how SAS could be used to visualize the locations where planes have disappeared. This blog […]

With all the recent news reports about the missing Flight 370, I wondered what other airplanes have disappeared without a trace ... and I used SAS to visualize that data! There was in interesting infographic on the Bloomberg website that sort of answered my question, but their map just had [...]

Have you ever eaten a biscuit, and thought to yourself "well, it ain't like momma fixed it"? (Alan Jackson fans will get that one!) ... So it is with food, and so it is with numbers and dates in graphs! Back in college, when I lived in the Alexander International Dorm [...]