@ReezaAlright. Will give that a shot to see what I get.
Thanks
This is what I did recently, but it was just a map for Florida and with just one variable. I created a format for the variable No_Exercise and I fed that on the map. That is why I was thinking I could generate a map for the US states again for the variables based on the quartiles I worked on by creating some sort of format just like I did for the single variable case for Florida map. But I still seem to be struggling with it though the work was due yesterday, I still want to learn.
This is the previous code. I used the same data set I uploaded earlier on:
proc gproject data=mapsgfk.us_counties out=florida degrees eastlong latlong;
where state eq 12; /*Get Florida information*/
id state;
run;
proc format; /*Make categories for No_Exercise numbers*/
value inter .='No data'
low- 20 = 'less than 20'
20.1 - 25 = '20.1 - 25'
25.1 - 30 = '25.1 - 30'
30.1 - 35 = '30.1 - 35'
35.1 - high = 'higher than 35';
run;
pattern1 v=s c=CX90B0D9;
pattern2 v=s c=CX6E86A6;/*light greenish blue*/
pattern3 v=s c=CX4C5D73;/* moderate greenish blue*/
pattern4 v=s c=CX2A3440; /*dark greenish blue*/
pattern5 v=s c=CX121519;
proc gmap data=florida1(rename=(County_FIPS_Code = county)) map=florida;
id county;
choro No_Exercise / discrete;
format No_Exercise inter.; /*Break up into groups*/
note 'Florida with No_Exercise'; /*Title*/
run;
quit;
Thanks
You're wanting to create state quartile maps?...
Several years back, the levels= option of proc gmap was enhanced to perform quantile binning - you can use levels=4 to do quartiles (levels would be quintiles, etc).
Since your data has multiple obsns per state, I use proc sql to first calculate the average value per state (you might want to so something even more sophisticated - for example if the obsns are by county, you might weight them by the county population).
Also a value of -1111.11 appears to represent "missing data"(?) - therefore I eliminate those values.
PROC IMPORT DATAFILE="RISKFACTORSANDACCESSTOCARE.csv" DBMS=CSV OUT=exam2 (rename=(state_fips_code=state)); GETNAMES=YES; RUN; /* -1111.1 appears to represent 'missing' values, so get rid of those obsns */ data exam2; set exam2 (where=(No_Exercise>0)); run; proc sql noprint; create table exam2_summarized as select unique state, avg(No_Exercise) as No_Exercise_avg from exam2 group by state; quit; run; legend1 label=none position=top shape=bar(.15in,.15in); title1 ls=1.5 "Average 'No Exercise' by State"; proc gmap data=exam2_summarized map=maps.us all; format No_Exercise_avg comma8.2; id state; choro No_Exercise_avg / cdefault=cornsilk /* states with no data */ levels=4 /* quartiles */ legend=legend1; run;
And here is the output:
@GraphGuyThat seems so cool. I made some changes and incorporate all the 10 variables hence creating 10 different maps for all 10 variables. When I compare it to the quartiles I created initially and with the 4 categories I was expecting, I see that under each 4 levels created in the map by using the levels=4, it captures each value for the quartiles computed manually. This seems cool now.
Thanks very much
@GraphGuyIndeed, I'm really learning a lot here right now. But another thing I will like to learn in addition is that can we or is there a way to format the various categories created under the map to some specific giving names? Fro instance, in the map you attached, we have the first category to be 17.88-21.72, Is there a way to rename this and other categories to say Less than Q1 for the first category (17.88-21.72)?
Thanks for the learning experience
You can hardcode the text you want at each of the legend ticks, via the legend statement...
legend1 label=none position=top shape=bar(.15in,.15in) value=(t=1 'Less than Q1');
This is just perfect @GraphGuy. Thanks so much. I really get it now. Supper good.
I do appreciate this.
Kind Regards,
I really do appreciate your input. But I guess I will continue asking for me until I fully appreciate SAS.
I previous worked on pie chart for each states with the means of these same 10 variables. I am not sure what I had is what I am supposed to get.
this is the code I used in the generating the charts and the chart is attached as well. Any inputs on the graphs?
For example, with the variable "Dentist" I see District occupying 102.80 and the remaining of the chart has Other 1775.69. I didn't understand where the Other came from. In my mind, I was expecting all states represent like what the variable "Early_Medicare" almost did.
Were you creating a pie chart with each slice representing a county? In a Ghart pie chart, by default if a slice is less than a certain percent of the pie, it goes into the 'Other' slice. I think you can use an option (maybe 'other=0' ?) to make it so that each county has a slice, no matter how small the slice. (I'm not sure this is a 'good' way to visualize the data, but at least it will give you a more clear picture of what's going on in your pie chart.)
@GraphGuyYou are so right. Pie chart in this case is not a good representation. That option you gave actually worked and it was observed that Text boundaries for the pie/donut slices overlap.
Thank you very much once again.
@GraphGuy @Reeza @ballardw...As always, thank you very much for making my learning of SAS more interesting and with fun.
I am still trying harder to interrogate graph to the core...Now I have all ten variables plotted on the map. But one thing I still think can be done but couldn't figure out is the maps all seem to have the same color scheme and hence, very difficult to study the maps individually. If one do not pay careful attention, it will appear the map has just been repeated 10 times, but each map represent a specific variable. So my problem is, can different colors be given to each variable on each map?
Also, against each variable on the map comes with the name of the statistic used, that is mean in bracket, can this name be suppressed?
Here is the code and output to that effect.
proc gproject data=mapsgfk.us_states out=mymap degrees eastlong latlong;
where state eq state;
id state;
run;
/* Assign a color to each map type */
pattern1 v=s c=CX90B0D9;
pattern2 v=s c=CX6E86A6;/*light greenish blue*/
pattern3 v=s c=CX4C5D73;/* moderate greenish blue*/
pattern4 v=s c=CX2A3440; /*dark greenish blue*/
pattern5 v=s c=CX121519;
legend1 label = (position = top justify = center
font = 'albany amt/bold' height = 4pct)
position = top shape = bar(.15in,.15in)
value = (t = 1 'Less than Q1' t = 2 'Between Q1 and Median'
t = 3 'Between Median and Q3' t = 4 'Greater than Q3');
proc gmap data = final(rename = (State_FIPS_Code = State)) map = mymap;
id State;
choro No_Exercise Few_Fruit_Veg Obesity
High_Blood_Pres Smoker Diabetes
Uninsured Elderly_Medicare
Prim_Care_Phys_Rate Dentist_Rate /
levels = 4 legend = legend1 statistic = mean;
/*Break up into groups*/
note "Map With all 10 Variables"; /*Title*/
run;
quit;
If you use the statistic= option, you get the '(Mean)' label appended to the title. I don't think there is a way to override it.
I would recommend using Proc Sql to pre-calculate the statistic, and then not use the statistic= option in gmap (see the example I previously posted).
@GraphGuyAlright, I will do that for the proc sql. One thing I noticed with the proc sql was that the map output came twice, any reason for that?
And how do I incorporate different colors for each variable?
Instead of using 1 Proc Gmap, with all the variables on the choro statement, use a separate Proc Gmap for each one ... and then you can use different pattern statements for each Gmap.
@GraphGuySounds good. I actually thought I could do all at once. But I will do them individually.
Thank you very much
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
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.
Ready to level-up your skills? Choose your own adventure.