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/)";
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.
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 🙂
Best,
Renato
Done! You can find the VA version here.
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 16. Read more here about why you should contribute and what is in it for you!
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.
Select SAS Training centers are offering in-person courses. View upcoming courses for: