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.
Get Python Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.