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.



Python Cookbook
Python Cookbook
ISBN: 0596007973
EAN: 2147483647
Year: 2005
Pages: 346

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net