Credit: Alexander Pletzer
You need to represent numbers in a given range as colors on a pseudocolor scale, typically for data-visualization purposes.
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
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.