9.11 Creating Color Scales
Credit: Alexander Pletzer
9.11.1 Problem
You need to represent
numbers in a given range as colors on a pseudocolor scale, typically
for datavisualization purposes.
9.11.2 Solution
Given a magnitude mag between given limits
cmin and cmax, the basic idea
is to return a color (R,G,B) tuple: light blue for cold (low
magnitude) all the way to yellow for hot (high magnitude). For
generality, each of R, G, and B can be returned as a float between
0.0 and 1.0:
import math
def floatRgb(mag, cmin, cmax):
""" Return a tuple of floats between 0 and 1 for R, G, and B. """
# Normalize to 01
try: x = float(magcmin)/(cmaxcmin)
except ZeroDivisionError: x = 0.5 # cmax == cmin
blue = min((max((4*(0.75x), 0.)), 1.))
red = min((max((4*(x0.25), 0.)), 1.))
green = min((max((4*math.fabs(x0.5)1., 0.)), 1.))
return red, green, blue
9.11.3 Discussion
In practical applications, R, G, and B will usually need to be
integers between 0 and 255, and the color will be a tuple of three
integers or a hex string representing them:
def rgb(mag, cmin, cmax):
""" Return a tuple of integers, as used in AWT/Java plots. """
red, green, blue = floatRgb(mag, cmin, cmax)
return int(red*255), int(green*255), int(blue*255)
def strRgb(mag, cmin, cmax):
""" Return a hex string, as used in Tk plots. """
return "#%02x%02x%02x" % rgb(mag, cmin, cmax)
When given a magnitude mag between
cmin and cmax, these two
functions return a color tuple (red, green, blue)
with each component on a 0255 scale. The tuple can be represented as
a hex string (strRgb), as required in Tk calls, or
as integers (rgb), as required in Java (AWT)
applications.
I often use these utility functions in my programs to create simple
pseudocolor graphics under PythonTkinter and JythonAWT. The color
maps are linear functions of the three colors (red, green, blue) with
saturation. Low magnitudes are associated with a light, cold blue,
high magnitudes with a warm yellow.
