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 data-visualization 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 0-1
try: x = float(mag-cmin)/(cmax-cmin)
except ZeroDivisionError: x = 0.5 # cmax == cmin
blue = min((max((4*(0.75-x), 0.)), 1.))
red = min((max((4*(x-0.25), 0.)), 1.))
green = min((max((4*math.fabs(x-0.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 0-255 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
pseudo-color graphics under Python-Tkinter and Jython-AWT. 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.
|