Data visualization with SAS programming

Fun w/SAS ODS Graphics: There's more than one way to skin a SAS dataviz

Reply
Highlighted
Frequent Contributor
Frequent Contributor
Posts: 76

Fun w/SAS ODS Graphics: There's more than one way to skin a SAS dataviz

RefugeeAdmissions.png

 

As I copped to in an old SGF paper, I'm not adverse to "borrowing" from Robert Allison's amazing-and-ever-growing SAS dataviz collection. So, when the idea of trying to implement Robert's SAS/GRAPH-based Trends in U.S. refugee admissions chart with SGPANEL was floated, well, I just had to give it a shot. Results above, code below. Not a replica, admittedly. With his uniscaled-but-not-space-wasting y-axes, consistent color usage, floating country labels, custom x-axis labels at the top and bottom, etc., Robert's chart is far more nuanced. Still, the SGPLOT version may be good enough for many people's purposes, and doesn't require much work. So, which way to go probably boils down to an impact-vs-effort decision on your part (and which software you have access to!). Now, how about someone coughing up a SAS Visual Analytics-based version so we can complete the trilogy? :-)

 

* Fun w/SAS ODS Graphics: SGPLOT take on SAS/GRAPH-based "Trends in U.S. refugee admissions" chart
  Based on SAS/GRAPH chart at blogs.sas.com/content/sastraining/2017/10/03/trends-in-u-s-refugee-admissions/
  Data sourced from wrapsnet.org/s/Graph-Refugee-Admissions-since-19759517.xls;

*==> Step 1: Get Excel data, transform it from Excel chart structure to relational;

proc import out=Admissions dbms=xls replace
            datafile ='/folders/myfolders/Graph+Refugee+Admissions+since+1975(9.5.17).xls';
            getnames=no; range="FY 1975-2017$A10:K52";
            
data AdmissionsNorm(keep=year country refugees);
array countries (8) $30. _temporary_ ("Africa" "Asia" "Europe" "Former Soviet Union" 
      "Kosovo" "Latin American Caribbean" "Near East South Asia" "PSI");
array numrefugees (8) b c e f g h i j;
set admissions;
year=a;
do sub=1 to 8;
  country=countries(sub);
  refugees=numrefugees(sub);
  output;
end;   

*==> Step 2: Produce the paneled chart!;

ods graphics / antialias height=14in width=8.5in;
proc sgpanel noautolegend;
title  height=12pt "U.S. Refugee Admissions by Region";
title2 height=10pt "Fiscal Year 1975 through Aug 31, 2017 (FY ends Sep 30)";
panelby country / onepanel uniscale=column noheader columns=1 spacing=3;
vbar year / response=refugees group=country transparency=.4;
inset country / nolabel textattrs=(size=14pt) position=topright;
colaxis display=(nolabel) grid valueattrs=(size=7pt) valuesrotate=vertical;
rowaxis display=(nolabel) grid valuesformat=comma11. valueattrs=(size=7pt); 
refline (1975 to 2015 by 5) / axis=x;
footnote height=8pt "Data source: Refugee Processing Center (wrapsnet.org/admissions-and-arrivals/)";

 

SAS Super FREQ
Posts: 1,134

Re: Fun w/SAS ODS Graphics: There's more than one way to skin a SAS dataviz

Nicely done, TC.  You have specified UNISCALE=column. It is also useful to keep the default view so each cell y-axis is uniform, allowing visual comparison of the values.  I like your usage of INSET for the class values suppressing the row header.  Easier to read.  I was happy to learn some data step coding using arrays, as used by you.

SAS Super FREQ
Posts: 73

Re: Fun w/SAS ODS Graphics: There's more than one way to skin a SAS dataviz

Hi @tc,

 

Nice work!

 

"Now, how about someone coughing up a SAS Visual Analytics-based version so we can complete the trilogy?"

Challenge accepted! I'll pull something in VA and share with the community Smiley Happy

 

Best,

Renato

Ask a Question
Discussion stats
  • 2 replies
  • 389 views
  • 11 likes
  • 3 in conversation