Im creating a heat map in SAS using proc sgplot to provide a visual for the % gain/loss within several deparments within different divisions. However, I am running into a problem with the y-scale. Being a percentage, I would ideally want positive numbers to be green, negative numbers be red, and neutral numbers be white. I have this color scale set properly, but the scale has .03 as the median instead of 0. Therefore, I am getting positive numbers (.01 and .02) to be red, while they should be green. Is there a way to adjust the Y scale and make 0 white, any positive number green, and any negative number red? I've tried using the ybinstart=-.05, but it is not changing my scale at all. I have attached a picture of the current scale that is incorrect. I appreciate your help.
I would call this the "Z scale" rather than the Y scale. What you want is a symmetric red-white-green color ramp that is centered on 0.
There are two ways to handle this situation. Range attribute maps appeared in 9.4M3. You can define a range attribute map for a symmetric data range. See
GTL overview: https://blogs.sas.com/content/graphicallyspeaking/2013/04/14/attributes-map-3-range-attribute-map/
SGPLOT usage: https://blogs.sas.com/content/graphicallyspeaking/2017/06/26/advanced-ods-graphics-range-attribute-m...
Your data map might look like this
ID ColorModel1 ColorModel2 Min Max
myID red white -0.07 0
myID white green 0 0.07
The simpler way (and the way I'd suggest if you don't have a recent version of SAS) is to prepend "fake data" to your data set. See
https://blogs.sas.com/content/iml/2016/02/17/include-and-order-categories-in-legends.html
In this case, if your variables are X, Y, and Z, you can prepend the following data
X Y Z
. . -0.07
. . 0.07
This "data" will force PROC SGPLOT to think that the range of Z is [-0.07, 0.07], but the missing values in X and Y prevent the procedure from including those observations in the graph.
Perfect! Thank you. I also had another question. I was interested in changing the size of the boxes dependant upon a variable. The larger the number, the larger the box, and vice versa. Is there a way to do this?
I think the HEATMAP and HEATMAPPARMS statements provide for a uniform grid of X-Y values. However, you might look into using a bubble plot instead of a heat map. The bubble plot is designed to have the marker sizes that vary according to the value of some response. If you use a bubble plot, you might have to bin the data yourself. For examples, see "counting observations in two-dimensional bins" and "Designing a quantile bin plot." For bubble plot basics, see "Getting started with a bubble plot."
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!
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.