BookmarkSubscribeRSS Feed
mhudec24
Calcite | Level 5

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. 

3 REPLIES 3
Rick_SAS
SAS Super FREQ

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.

mhudec24
Calcite | Level 5

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?

Rick_SAS
SAS Super FREQ

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."

SAS INNOVATE 2024

Innovate_SAS_Blue.png

Registration is open! SAS is returning to Vegas for an AI and analytics experience like no other! Whether you're an executive, manager, end user or SAS partner, SAS Innovate is designed for everyone on your team. Register for just $495 by 12/31/2023.

If you are interested in speaking, there is still time to submit a session idea. More details are posted on the website. 

Register now!

How to Concatenate Values

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.

Get the $99 certification deal.jpg

 

 

Back in the Classroom!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 3 replies
  • 1085 views
  • 0 likes
  • 2 in conversation